在 Laravel Query Builder 中根据他们的技能以及匹配的技能选择用户

Posted

技术标签:

【中文标题】在 Laravel Query Builder 中根据他们的技能以及匹配的技能选择用户【英文标题】:Selecting users based on their skills along with matched skills in Laravel Query Builder 【发布时间】:2018-06-26 00:49:51 【问题描述】:

我想根据他们的技能在我的数据库中搜索用户。然后我想获取与技能匹配的用户配置文件。

我的数据库迁移

用户

$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');

技能

$table->increments('id');
$table->string('name');

用户技能

$table->increments('id');
$table->unsignedInteger('user_id');
$table->unsignedInteger('skill_id');

这是我的模型:-

用户.php

public function skill()
    return $this->belongsToMany(Skill::class, 'user_skill');

用户和技能模型具有多对多关系。

现在,我编写了一个查询,根据他们的技能从“用户”表中选择用户。我的查询如下所示:-

$skills = ["html", "CSS", "javascript"];
$result = User::with('skill')
    ->join('user_skill', 'users.id','=','user_skill.user_id')
    ->join('skills', 'user_skill.skill_id', '=', 'skills.id')
    ->select('users.name as Name','users.id as UserId')
    ->selectRaw('COUNT(skills.id) as skill_count')
    ->whereIn('skills.name', $skills)
    ->groupBy('users.id')
    ->orderBy('skill_count', 'desc')
    ->get();

经过一些格式化后,此查询给了我以下结果:-

但我想获得用户以及他们的技能。给定屏幕截图中的每个用户都有大约 5 个技能。 with('skill') 子句应该返回用户及其技能。但是当我将结果放入 foreach 循环中时,

foreach($result as $r)
    print_r($r->skill);

技能栏为空。 laravel with() 子句应该与用户一起注入技能,因为他们有多对多的关系。是不是我做错了什么?任何帮助表示赞赏。

注意: 当我查询 User::with('skill')->get() 时,它会返回所有具有技能的用户。所以,我想这里的关系绑定很好。

提前致谢。

【问题讨论】:

【参考方案1】:
$users = User::whereHas('skills'=>function($query)
  $query->whereIn('name', ['css', 'html', 'javascript']);
)->withCount('skills')
->select('users.name as Name','users.id as UserId')
->groupBy('users.id')
->orderBy('skill_count', 'desc')
->get();

当您对结果进行分组时,我认为不需要 join 语句。并且您可以在上面更简单的代码中实现您想要的所有东西。另外,正如另一位用户所提到的,请注意拼写错误。

【讨论】:

【参考方案2】:

我认为它是空的,因为您的查询似乎有错字,而不是 with('skills') 您已经写了它的技能,而加入时您使用了正确的列名。

所以解决这个问题:

$result = User::with('skills')
    ->join('user_skill', 'users.id','=','user_skill.user_id')
    ->join('skills', 'user_skill.skill_id', '=', 'skills.id')
    ->select('users.name as Name','users.id as UserId')
    ->selectRaw('COUNT(skills.id) as skill_count')
    ->whereIn('skills.name', $skills)
    ->groupBy('users.id')
    ->orderBy('skill_count', 'desc')
    ->get();

【讨论】:

以上是关于在 Laravel Query Builder 中根据他们的技能以及匹配的技能选择用户的主要内容,如果未能解决你的问题,请参考以下文章

Laravel中的Query Builder

Laravel中的Query Builder

Laravel Query:为 Query Builder 实现 Eloquent Scope

Laravel 查询错误 - 调用未定义的方法 Illuminate\Database\Query\Builder::query()

如何在 Laravel Query Builder 中执行 TRIM() 和 CONCAT()?

在 Laravel Query Builder 中使用 `AND`,语法错误 (orOn)