Laravel:如何编写关于 belongsToMany 关系的连接计数查询?

Posted

技术标签:

【中文标题】Laravel:如何编写关于 belongsToMany 关系的连接计数查询?【英文标题】:Laravel: How to write a join count query on belongsToMany relationships? 【发布时间】:2017-09-29 19:59:48 【问题描述】:

我得到了以下信息:

User、Role,带有一个 role_user 数据透视表和一个 belongsToMany 关系 用户,位置,具有 location_user 数据透视表和 belongsToMany 关系

用户有 2 个角色:所有者和园丁

位置有一个“gardeners_max”字段

在模型位置:

protected $appends = ['is_full'];

public function getIsFullAttribute()

    return $this->attributes['name'] = $this->remainingGardeners() <= 0;


public function countGardeners() 

    return $this->gardeners()->count();


public function remainingGardeners() 

    return $this->gardeners_max - $this->countGardeners();

现在,这样做:

Location::all();

我明白了:

[
 
   name: 'LocationA',
   gardeners_max: 3,
   owners: [...],
   garderners: [...]
   ...
   is_full: false
 
]

这很酷。但是...不可能对附加属性执行 WHERE 子句。

Location::where('is_full',true)->get() // Unknown column 'is_full' in 'where clause'

所以我想写一个连接查询,这样我就可以在 is_full 上做一个 where 子句

我就是找不到路。任何帮助将不胜感激!

重要提示:

我知道获取结果的 filter() 方法,但我需要在这里执行一个 scopeQuery

【问题讨论】:

【参考方案1】:

您可以像这样在您的位置模型中设置范围

public function scopeFull(Builder $query)

    return $query->where('is_full', true);

现在您只需像这样获得所有位置

Location::full()->get();

【讨论】:

谢谢,但它不会起作用,因为在 WHERE 子句中没有考虑附加属性......所以我想我需要一个连接查询【参考方案2】:

您可以在从数据库加载对象后尝试操作Collection

Location::get()->where('is_full', true)->all();

(您必须先使用get,然后再使用all,否则不确定是否有效)

不确定这是优化的想法。

【讨论】:

谢谢,但正如我刚刚编辑的那样,我真的需要做(并理解)如何编写连接查询

以上是关于Laravel:如何编写关于 belongsToMany 关系的连接计数查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 eloquent 在 laravel 中编写多个连接

如何在 laravel 5.4 中编写 mysql 查询?

如何在 laravel 8 中编写子查询?

Laravel 5 - 我应该在哪里编写这个函数,以及如何编写?

如何在 laravel 中编写此查询?有啥建议么?

如何编写与 laravel 相同的自己的 DD() 函数?