laravel加载具有特定技能的候选人

时间:2017-04-10 13:51:41

标签: php html laravel search

在我的网站中,用户可以创建候选人(一对多关系),这些候选人可以拥有技能(多人)。

用户模型:

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

2 个答案:

答案 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();