如何在Laravel Backpack的Candidate CRUD中展示关联的User字段?
问题:Backpack CRUD中展示Candidate关联的Vacancy的Manager字段
模型关联关系
Candidate ↔️ Vacancy(多对多),Vacancy → User(一对多,manager关联)
Candidate模型代码
class Candidate extends Model { public function vacancy() { return $this->belongsToMany( Vacancy::class, 'vacancy_has_candidate', 'candidate_id', 'vacancy_id' ); } }
Vacancy模型代码
class Vacancy extends Model { public function candidate() { return $this->belongsToMany( Candidate::class, 'vacancy_has_candidate', 'vacancy_id', 'candidate_id' ); } public function manager() { return $this->hasMany(User::class, 'manager_id'); } }
User模型代码
class User extends Authenticatable { public function vacancy() { return $this->belongsTo(Vacancy::class, 'manager_id'); } }
需求与尝试
希望在Candidate的CRUD中展示关联字段,调用Vacancy模型的manager方法并输出User模型的字段。尝试的代码如下:
class CandidateCrudController extends CrudController { // ... public function setupCreateOperation() { $this->crud->addFields([ [ 'name' => 'vacancy', 'type' => 'relationship', 'label' => 'Vacancy', 'model' => Vacancy::class, 'entity' => 'manager', // 想调用Vacancy模型的这个方法 'attribute' => 'title', // User模型的字段 'ajax' => true, ] ]); } // ... }
错误信息
Looks like field vacancy is not properly defined. The manager() relationship doesn't seem to exist on the App\Models\Candidate model
解决方案
错误原因
Backpack的relationship字段中,entity参数指定的是当前CRUD对应的模型(即Candidate)上的关联方法名,而非关联模型(Vacancy)上的方法。你指定entity => 'manager',Backpack会去Candidate模型中查找manager()关联,自然找不到,从而报错。
正确实现方式
根据你的需求场景,分两种情况处理:
场景1:创建/编辑Candidate时,选择Vacancy的选项中显示对应Manager信息
- 保持
entity为Candidate模型上的关联方法vacancy,然后在Vacancy模型中定义一个访问器,拼接Vacancy自身信息和Manager信息:
// 在Vacancy模型中添加访问器 public function getVacancyWithManagerAttribute() { // 假设要显示Vacancy的title和User的name字段,根据实际字段调整 $managerNames = $this->manager->pluck('name')->join(', '); return "{$this->title} (负责人:{$managerNames})"; }
- 修改CRUD字段配置:
$this->crud->addFields([ [ 'name' => 'vacancy', 'type' => 'relationship', 'label' => '职位', 'entity' => 'vacancy', // Candidate模型上的关联方法 'model' => Vacancy::class, 'attribute' => 'vacancy_with_manager', // 使用刚定义的访问器 'ajax' => true, ] ]);
场景2:在Candidate的列表/详情页展示关联Vacancy对应的Manager信息
添加自定义列,通过闭包获取关联的Manager数据:
// 在setupListOperation中添加 $this->crud->addColumn([ 'name' => 'vacancy_manager', 'label' => '职位负责人', 'type' => 'text', 'value' => function($entry) { // 处理多对多关联下的多个Vacancy和多个Manager的情况 return $entry->vacancy->flatMap(function($vacancy) { return $vacancy->manager->pluck('name'); })->unique()->join(', '); } ]);
内容的提问来源于stack exchange,提问作者KordDEM
相关产品推荐
相关产品推荐

