【问题标题】:Laravel: get users with multiple educations by education levelLaravel:按教育水平获取具有多种教育的用户
【发布时间】:2019-04-29 01:30:28
【问题描述】:

我的数据库中有默认的 laravel users 表和我的自定义 educations 表。在educations 表中,用户可以保存教育历史。

例如educations数据:

------------------------------------------------------------
id | user_id | university | speciality | finish_year | level
------------------------------------------------------------
 1 |   16    |   Boston   |  Developer |    2018     |   4 
------------------------------------------------------------
 2 |   10    |   Sinergy  |   Designer |    2014     |   4 
------------------------------------------------------------
 9 |   16    |   Sinergy  |  Economist |    2010     |   8 
------------------------------------------------------------

现在如何按教育程度让用户使用 laravel eloquent?

例如获取教育水平 == 4 的用户

【问题讨论】:

标签: laravel eloquent laravel-5.7


【解决方案1】:

如果你的关系设置正确,那么在你的User 模型中你应该有这样的东西:

public function educations() {
    return $this->hasMany(Education::class);
}

那么简单的使用方式如下:

User::with(['educations' => function($query) {
    $query->where('level', 4);
}])->get()->filter(function($user) {
    return $user->educations->count() > 0;
});

相反的方法是:

Education::with('user')->where('level', 4)->get();

这将为您提供级别为 4 的教育列表,以及分配给它的每个用户。

【讨论】:

  • 是的,我有正确的关系。现在我会试试你的答案代码@nakov。谢谢!
  • 此代码对我不起作用。当我运行查询返回所有用户而不是自定义级别的用户。
  • @AndreasHunter 是的,它会返回所有用户,但如果级别为 4,它将返回他们的教育。所以你可以在之后过滤他们现在看看我编辑的答案。如果 educations 集合包含任何项目,它将返回。另一种方法是让所有用户都通过教育,但我认为这不是一个好方法。如果你愿意,我也可以给你举个例子。
  • 请给我你的第二个示例变体,并告诉我在 laravel 中我的任务@nakov 的最佳实践是什么?
  • @AndreasHunter 我更新了我的答案。这实际上取决于您要达到的目标。所以这两个都是很好的例子,但我会选择第一个,所以你会得到用户列表而不是教育列表。
【解决方案2】:

考虑到您的 User 模型中有一个 educations 方法表示 HasMany 关联,您可以使用 eloquent 的 has(或 whereHas)方法:

$users = App\User::whereHas('educations', function ($query) {
    $query->where('level', 4);
})->get();

这是docs的链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 2015-03-21
    • 2023-03-05
    • 1970-01-01
    • 2021-04-08
    相关资源
    最近更新 更多