【问题标题】:laravel load candidates with given skillslaravel 加载具有给定技能的候选人
【发布时间】:2017-04-10 13:51:41
【问题描述】:

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

用户模型:

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 中搜索。但是我需要一个搜索栏来搜索具有某些技能的候选人,比如我想搜索与“css”同步的候选人,并且只在表格中显示这些候选人。

我阅读了 laravel 文档并尝试加载它:

$hasCss = $candidates->load(['skills' => function ($query) {
        $query->where('name', '=',  'css');
    }]);

但这只是加载了所有候选人,只显示了 css 技能,即使是没有 css 技能的候选人。我只想加载有技能的候选人,而将其他候选人排除在外。

我该怎么做,我一无所知:s

【问题讨论】:

  • "我想搜索与 'css' 同步的候选人,并且只在表格中显示。" ..但是你说..“但这只是加载了所有候选人并且只显示了css技能,如果他们没有它,他们就没有技能。” ...它混淆你真正想要什么?你能解释更多吗?
  • 我希望它只加载具有 css 技能的候选人。但这种急切的负载所做的只是让所有候选人都只拥有 css 技能,即使他们甚至没有。
  • 这与 laravel 非常相关。您应该使用您拥有的用户/技能/候选人的模型关系来更新您的问题。这会有所帮助
  • 我已经这样做了?用户有很多候选人,候选人有很多技能。为问题添加了模型函数

标签: php html laravel search


【解决方案1】:

您正在寻找whereHas(...)

当前用户的具有 CSS 技能的候选人:

$withCss = Auth::user()->candidates()->whereHas('skills', function ($q) {
    $q->where('name', 'css');
})->get();

【讨论】:

    【解决方案2】:

    在您的技能模型中,您的关系定义有误。你写的

    public function candidates() {
        return $this->belongsToMany(Candidate::class, 'candidate_skill', 'candidate_id', 'skill_id')
        ->withTimestamps();
    }
    

    交换“candidate_id”和“skill_id”。本地外键总是在前。

    public function candidates() {
        return $this->belongsToMany(Candidate::class, 'candidate_skill', 'skill_id', 'candidate_id')
        ->withTimestamps();
    }
    

    【讨论】:

    • 哦,从来没有遇到任何错误,所以不确定它是否真的有任何作用,但无论如何感谢:3
    • 还没有遇到错误...因为您还没有尝试通过技能让候选人。就像当您想获得所有候选人 $skill = Skill::with('candidates')-&gt;find(1); 的技能时,您会收到该错误。
    猜你喜欢
    • 1970-01-01
    • 2010-12-27
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多