Как посчитать количество строк с условием - PullRequest
0 голосов
/ 06 февраля 2020

В 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' 

, когда были подсчитаны все строки.

Какой путь правильный ?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...