假设我们有一个agents表,该表具有一quota列,并且与表具有多对多关系tickets。使用Laravel Eloquent ORM,如何仅选择“票证”数量少于或等于“配额”的代理?必须避免装载过多的物品。class Agent extends Model { public function tickets() { return $this->belongsToMany(Ticket::class, 'agent_tickets')->using(AgentTicket::class); } public function scopeQuotaReached($query) { // Does not work. withCount is an aggregate. return $query->withCount('tickets')->where('tickets_count', '<=', 'quota'); // Does not work. Tries to compare against the string "quota". return $query->has('tickets', '<=', 'quota'); }}与使用DB::raw()带有手动加入,分组和计数的查询相比,有没有一种更雄辩的(双关语意)方法来解决此问题?编辑作品:$query->withCount('tickets')->having('tickets_count', '<=', DB::raw('quota'))->get();作品:$query->withCount('tickets')->having('tickets_count', '<=', DB::raw('quota'))->exists();休息时间:(投掷)$query->withCount('tickets')->having('tickets_count', '<=', DB::raw('quota'))->count();
2 回答
MMTTMM
TA贡献1869条经验 获得超4个赞
像之类的派生列tickets_count
只能在HAVING
子句中访问。
由于没有havingColumn()
方法,因此必须使用原始表达式:
$query->withCount('tickets')->having('tickets_count', '<=', DB::raw('quota'));
PIPIONE
TA贡献1829条经验 获得超9个赞
在数据库级别,我不知道如何实现此目的,但是您可以在集合级别进行。
// Get users
$agents = Agent::withCount('tickets')->get();
// filter
$good_agents = $agents->filter(function ($agent, $key) {
return $agent->tickets_count >= $agent->quota;
})
->all();
当然,您可以内联它:
$good_agents = Agent
::withCount('tickets')
->get()
->filter(function ($agent, $key) {
return $agent->tickets_count >= $agent->quota;
})
->all();
- 2 回答
- 0 关注
- 145 浏览
添加回答
举报
0/150
提交
取消