在我的网站中,用户可以创建候选人(一对多关系),这些候选人可以拥有技能(多人)。
用户模型:
public function candidates() {
return $this->hasMany(Candidate::class);
}
候选人模特:
public function skills() {
return $this->belongsToMany(Skill::class, 'candidate_skill', 'candidate_id', 'skill_id');
}
技能模型:
public function candidates() {
return $this->belongsToMany(Candidate::class, 'candidate_skill', 'candidate_id', 'skill_id')
->withTimestamps();
}
我已经有一个索引页面,用户可以在其中查看他所有的候选人
$candidates = Auth::user()->candidates;
在编辑页面上,技能可以同步到有问题的候选人
$candidate->skills()->sync(request()->skills);
并返回索引页面,显示候选人有多少技能
<td>{{count($candidate->skills)}}</td>
现在,我需要创建一个搜索栏。我的表已经有一个(dataTable)来搜索已经加载的td&#39; s。但是我需要一个搜索栏来搜索具有某些技能的候选人,比如说我想搜索与“css&#39;”同步的候选人。并且只显示表中的那些。
我仔细阅读了laravel文档并尝试加载它:
$hasCss = $candidates->load(['skills' => function ($query) {
$query->where('name', '=', 'css');
}]);
但这只是加载了所有仅显示css技能的候选人,即使是没有它的候选人。我只想加载具有该技能的候选人并将其他人留下。
我该怎么做,我无能为力:s
答案 0 :(得分:0)
在您的技能模型中,您的关系定义中存在错误。你写了
public function candidates() {
return $this->belongsToMany(Candidate::class, 'candidate_skill', 'candidate_id', 'skill_id')
->withTimestamps();
}
交换候选人_id&#39;和&#39; skill_id&#39;。本地外键始终是第一位的。
public function candidates() {
return $this->belongsToMany(Candidate::class, 'candidate_skill', 'skill_id', 'candidate_id')
->withTimestamps();
}
答案 1 :(得分:0)
您正在寻找whereHas(...)
当前用户具有CSS技能的候选人:
$withCss = Auth::user()->candidates()->whereHas('skills', function ($q) {
$q->where('name', 'css');
})->get();