В Laravel 6 Мне нужно получить количество строк с условием, например:
$ads_total_count = Ad
::getByTitle($this->filter_title)
->getByStatus('A')
->getUserByStatus('A')
->leftJoin('users', 'users.id', '=', 'ads.creator_id')
->leftJoin('ad_images', 'ad_images.ad_id', '=', 'ads.id')
->addSelect(['ad_images_count' => AdImage
::selectRaw('count(*)')
->whereColumn('ad_images.ad_id', 'ads.id')
])
->havingRaw(' ( SELECT count(*) '.
' FROM `'.$prefix.'ad_images'.'` '.
' WHERE '.$prefix.'ad_images.ad_id = '.$prefix.'ads.id ) > ?', [4])
->count();
, и у меня есть ошибка: неизвестный столбец «ads-backend-api.sda_ads.id» в 'where clause' (SQL:
select count(*) as aggregate from
`sda_ads` left join `sda_users` on `sda_users`.`id` = `sda_ads`.`creator_id` left join
`sda_ad_images` on `sda_ad_images`.`ad_id` = `sda_ads`.`id` where
`sda_ads`.`status` = A and `sda_users`.`status` = A
having ( SELECT count(*) FROM `sda_ad_images` WHERE sda_ad_images.ad_id = sda_ads.id ) > 4
выглядит так, как будто sda_ads.id в условии HAVING не используется из основного выбора? и столбец ad_images_count отсутствует в запросе sql.
Я сократил рекламу, имея фразу
$ads_total_count = Ad
::getByTitle($this->filter_title)
->getByStatus('A')
->getUserByStatus('A')
->leftJoin('users', 'users.id', '=', 'ads.creator_id')
->leftJoin('ad_images', 'ad_images.ad_id', '=', 'ads.id')
->addSelect(['ad_images_count' => AdImage
::selectRaw('count(*)')
->whereColumn('ad_images.ad_id', 'ads.id')
])
->havingRaw(' ( SELECT count(*) '.
' FROM `'.$prefix.'ad_images'.'`, `'.$prefix.'ads'.'` '.
' WHERE '.$prefix.'ad_images.ad_id = '.$prefix.'ads.id ) > ?', [4])
->count();
, и я начал работать, но недействительно sql:
SELECT count(*) AS aggregate
FROM `sda_ads`
LEFT JOIN `sda_users` on `sda_users`.`id` = `sda_ads`.`creator_id`
LEFT JOIN `sda_ad_images` on `sda_ad_images`.`ad_id` = `sda_ads`.`id`
WHERE `sda_ads`.`status` = 'A' AND `sda_users`.`status` = 'A'
HAVING ( SELECT count(*)
FROM `sda_ad_images`, `sda_ads`
WHERE sda_ad_images.ad_id = sda_ads.id ) > '4'
, когда были подсчитаны все строки.
Какой путь правильный ?
Спасибо!