setTable(request('table_name')); // 设置关联关系 $this->relation(); // 设置json转数组字段 $this->casts = $this->jsonToArray(); } /** * 创建人关联 * @return \Illuminate\Database\Eloquent\Relations\HasOne */ public function admin() { return $this->hasOne(Admin::class, 'id', 'admin_id'); } /** * 关联创建部门 * @return \Illuminate\Database\Eloquent\Relations\HasOne */ public function department() { return $this->hasOne(Department::class, 'id', 'department_id'); } /** * 获取所有关联关系 * $raw=true返回原始设置,false只输出关联关系名字数组 */ public function allRelationFields($raw = false) { $customFormRelation = request('customForm')->relation; if (empty($customFormRelation)) return []; $customFormRelation = $customFormRelation->filter(function ($item) { return !empty($item->link_table_name) && !empty($item->link_relation) && !empty($item->local_key) && !empty($item->foreign_key) && !empty($item->link_with_name); }); // 输出原始数据 if ($raw) return $customFormRelation; $customFormRelation = $customFormRelation->pluck('link_with_name')->toArray(); $baseRelation = ['admin', 'department']; return array_merge($baseRelation, $customFormRelation); } /** * 构建关联关系 */ public function relation() { $customFormRelations = request('customForm')->relation; if (empty($customFormRelations)) return true; // 去除无效的关联 $customFormRelations = $customFormRelations->filter(function ($item) { return !empty($item->link_table_name) && !empty($item->link_relation) && !empty($item->local_key) && !empty($item->foreign_key) && !empty($item->link_with_name); }); foreach ($customFormRelations as $item) { // 关联其他表数据 self::resolveRelationUsing($item->link_with_name, function ($fromModel) use ($item) { if ($item->link_table_name == 'uploads') { // 上传关联 $relatedModel = (new Upload())->newQuery(); } else { $relatedModel = tableNameToModel($item->link_table_name); } return $fromModel->{$item->link_relation}($relatedModel, $this, $item->foreign_key, $item->local_key); }); } return true; } /** * json字段转数组 */ public function jsonToArray() { $customFormFields = request('customFormFields'); if (empty($customFormFields)) return []; $casts = $customFormFields->whereIn('edit_input', CustomFormField::getJsonFieldType()) ->pluck('field') ->mapWithKeys(function ($item) { return [$item => 'json']; })->toArray(); return $casts; } }