Здесь необходимо использовать условное агрегирование:
return $this->hasMany(Facility::class)
->select("facility",
DB::raw("COUNT(CASE WHEN has_it = 1 THEN 1 END) AS has_it_true"),
DB::raw("COUNT(CASE WHEN has_it = 0 THEN 1 END) AS has_it_false"))
->groupBy('facility');
Это будет соответствовать следующему необработанному запросу MySQL:
SELECT
facility,
COUNT(CASE WHEN has_it = 1 THEN 1 END) AS has_it_true,
COUNT(CASE WHEN has_it = 0 THEN 1 END) AS has_it_false
FROM port_facilities
GROUP BY
facility;
Обратите внимание, что я не включил id
и port_id
в предложении SELECT
, поскольку MySQL может не принимать эти столбцы.В общем, при выполнении GROUP BY facility
мы можем выбрать только facility
и совокупность столбцов, отличных от facility
.