feat(curd): 关联表优化支持 add relation support and optimize model associations
- Add support for handling relations in CURD operations - Optimize model associations to use hasOne instead of belongsTo - Implement field selection for relations - Update controller to handle AJAX requests and return JSON data Modify model to include relation methods
This commit is contained in:
@@ -355,6 +355,7 @@ class BuildCurd
|
||||
if (!empty($bindSelectField) && !in_array($bindSelectField, array_column($columns, 'Field'))) {
|
||||
throw new TableException("关联表{$relationTable}不存在该字段: {$bindSelectField}");
|
||||
}
|
||||
$onlyFields = [];
|
||||
foreach ($columns as $vo) {
|
||||
if (empty($primaryKey) && $vo['Key'] == 'PRI') {
|
||||
$primaryKey = $vo['Field'];
|
||||
@@ -362,6 +363,7 @@ class BuildCurd
|
||||
if (!empty($onlyShowFields) && !in_array($vo['Field'], $onlyShowFields)) {
|
||||
continue;
|
||||
}
|
||||
if (!empty($onlyShowFields)) $onlyFields[] = $vo['Field'];
|
||||
$colum = [
|
||||
'type' => $vo['Type'],
|
||||
'comment' => $vo['Comment'],
|
||||
@@ -388,6 +390,7 @@ class BuildCurd
|
||||
'bindSelectField' => $bindSelectField,
|
||||
'delete' => $delete,
|
||||
'tableColumns' => $formatColumns,
|
||||
'onlyFields' => $onlyFields,
|
||||
];
|
||||
if (!empty($bindSelectField)) {
|
||||
$relationArray = explode('\\', $modelFilename);
|
||||
@@ -1038,7 +1041,7 @@ class BuildCurd
|
||||
$relationCode = '';
|
||||
foreach ($this->relationArray as $key => $val) {
|
||||
$relation = CommonTool::lineToHump($key);
|
||||
$relationCode = "->withJoin('{$relation}', 'LEFT')\r";
|
||||
$relationCode = "with(['{$relation}'])";
|
||||
if (!empty($val['bindSelectField']) && !empty($val['primaryKey'])) {
|
||||
$constructRelation = '$notes["' . lcfirst($val['foreignKey']) . '"] = \app\admin\model\\' . $val['modelFilename'] . '::column("' . $val['bindSelectField'] . '", "' . $val['primaryKey'] . '");';
|
||||
}
|
||||
@@ -1092,16 +1095,17 @@ class BuildCurd
|
||||
$relationList = '';
|
||||
if (!empty($this->relationArray)) {
|
||||
foreach ($this->relationArray as $key => $val) {
|
||||
$relation = CommonTool::lineToHump($key);
|
||||
// $relationCode = CommonTool::replaceTemplate(
|
||||
// $this->getTemplate("model{$this->DS}relation"),
|
||||
// [
|
||||
// 'relationMethod' => $relation,
|
||||
// 'relationModel' => "\app\admin\model\\{$val['modelFilename']}",
|
||||
// 'foreignKey' => $val['foreignKey'],
|
||||
// 'primaryKey' => $val['primaryKey'],
|
||||
// ]);
|
||||
// $relationList .= $relationCode;
|
||||
$relation = CommonTool::lineToHump($key);
|
||||
$relationCode = CommonTool::replaceTemplate(
|
||||
$this->getTemplate("model{$this->DS}relation"),
|
||||
[
|
||||
'relationMethod' => $relation,
|
||||
'relationModel' => "{$val['modelFilename']}::class",
|
||||
'foreignKey' => $val['primaryKey'],
|
||||
'primaryKey' => $val['foreignKey'],
|
||||
'relationFields' => empty($val['onlyFields']) ? "" : "->field('{$val['primaryKey']}," . implode(',', $val['onlyFields']) . "')",
|
||||
]);
|
||||
$relationList .= $relationCode;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,8 +17,9 @@ class {{controllerName}} extends AdminController
|
||||
{
|
||||
parent::__construct($app);
|
||||
self::$model = {{modelFilename}}::class;
|
||||
$this->notes = $notes = self::$model::$notes;
|
||||
$notes = self::$model::$notes;
|
||||
{{constructRelation}}
|
||||
$this->notes =$notes;
|
||||
$this->assign(compact('notes'));
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
|
||||
#[NodeAnnotation(title: '列表', auth: true)]
|
||||
public function index(\app\Request $request): \think\response\Json|string
|
||||
{
|
||||
if ($request->isAjax()) {
|
||||
if (input('selectFields')) {
|
||||
return $this->selectList();
|
||||
}
|
||||
list($page, $limit, $where) = $this->buildTableParams();
|
||||
$count = self::$model::where($where)->count();
|
||||
$list = self::$model::where($where)->{{relationIndexMethod}}->page($page, $limit)->order($this->sort)->select()->toArray();
|
||||
$data = [
|
||||
'code' => 0,
|
||||
'msg' => '',
|
||||
'count' => $count,
|
||||
'data' => $list,
|
||||
];
|
||||
return json($data);
|
||||
}
|
||||
return $this->fetch();
|
||||
}
|
||||
@@ -18,4 +18,6 @@ class {{modelName}} extends TimeModel
|
||||
|
||||
public static array $notes = {{selectArrays}};
|
||||
|
||||
{{relationList}}
|
||||
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
public function {{relationMethod}}()
|
||||
{
|
||||
return $this->belongsTo('{{relationModel}}', '{{foreignKey}}', '{{primaryKey}}');
|
||||
return $this->hasOne({{relationModel}}, '{{foreignKey}}', '{{primaryKey}}'){{relationFields}};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user