为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Laravel Eloquent中将相关计数与自己的列进行比较?

如何在Laravel Eloquent中将相关计数与自己的列进行比较?

PHP
慕姐4208626 2021-04-05 13:15:41
假设我们有一个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'));


查看完整回答
反对 回复 2021-04-23
?
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();


查看完整回答
反对 回复 2021-04-23
  • 2 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信