【问题标题】:Laravel/Eloquent conditions on subproperties don't apply子属性的 Laravel/Eloquent 条件不适用
【发布时间】:2023-03-30 01:40:01
【问题描述】:

我有以下型号:

  • 客户端
    • belongsToMany(组)
    • belongsToMany(客户端)

我想要的是所有组的数组,其中每个组都包含属于它的客户端。

我可以通过以下代码实现这一点:

Group::with('clients')->get();

现在我只想获取客户端状态属性为 0 的组和客户端。因此,如果组中有多个客户端,则结果不应包含状态为 !=1 的客户端。此外,如果此条件为组返回 0 个客户端,则该组也不应包含在最终结果中。

到目前为止我尝试了什么:

Group::with(['clients' => function($query) {
  $query->where('clients.status', '!=', 1);
}])->whereHas('clients', function($query) {
  $query->where('clients.status', '!=', 1);
})->get();

不知何故,当我执行查询时,这两个 where 条件都不适用。我错过了什么或做错了什么?

【问题讨论】:

  • 您说您“只想获取客户端状态属性为 1 的组”,但您的查询有 clients.status != 1。我错过了什么吗?
  • @tptcat 打错了,我改正了
  • 链接用户和组的数据透视表是什么样的?只是user_idgroup_id吗?
  • 没错。数据透视表中不涉及其他属性。 (除了创建等)

标签: laravel laravel-5 eloquent


【解决方案1】:

根据 laravel 文档,您期望的结果应该是以下语句的结果:

Group::whereHas('clients', function($query) {
  $query->where('status', '!=', 1);
})->get()

这是参考:https://laravel.com/docs/5.5/eloquent-relationships#querying-relationship-existence

【讨论】:

  • @kreilinger - 这样效果最好。您提到的其他检查应在此查询之后进行。我不认为你可以做你在一个大查询中提到的所有事情。
  • 正如我在第一篇文章中提到的,我需要将客户包括在组中。将您的代码更改为以下内容不起作用(包括状态为 0 的客户端。)Group::orderBy('number')->with('clients')->whereHas('clients', function($query) { $query->where('status', '!=', 0); })->get();
  • @kreilinger 您在 where 子句中使用了 'clients.status'。它解决了你的问题吗?现在可以用了吗?
猜你喜欢
  • 2015-03-28
  • 1970-01-01
  • 2017-04-29
  • 2014-06-17
  • 2019-12-28
  • 2022-07-06
  • 2022-01-11
  • 2015-07-12
  • 2015-01-26
相关资源
最近更新 更多