Предположим, у нас есть таблица 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()
с объединением, группировкой и подсчетом вручную?
EDIT
Работает:
$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();
СВЯЗАННЫХ
https://github.com/laravel/framework/issues/14492
Вопрос закрыт, ссылки на # 9307 я выложил там. Будем следить.