Laravel 我在使用计数时遇到未知列错误

Laravel 我在使用计数时遇到未知列错误,laravel,eloquent,Laravel,Eloquent,在Laravel 6中,我有一个与相关图像计数的广告请求 $ads = Ad ->getByTitle($this->filter_title) ->onlyNoneInfo() ->getByStatus('A') //->imagesCount(true) ->getUserByStatus('A') ->leftJoin('users', 'users.id', '=', 'ads.creator_i

在Laravel 6中,我有一个与相关图像计数的广告请求

$ads = Ad
    ->getByTitle($this->filter_title)
    ->onlyNoneInfo()
    ->getByStatus('A')
    //->imagesCount(true)
    ->getUserByStatus('A')
    ->leftJoin('users', 'users.id', '=', 'ads.creator_id')
    ->orderBy($this->order_by, $this->order_direction)

    ->select(
        'ads.*',
        'users.name as creator_username',
        'users.email as creator_email',
        'users.phone as creator_phone'
    )->addSelect(['ad_images_count' => AdImage
        ::selectRaw('count(*)')
        ->whereColumn('ad_images.ad_id', 'ads.id')
    ])

    ->offset($limit_start)
    ->take($ads_per_page)
    ->distinct()
    ->paginate($ads_per_page);
我看到sql请求广告图片计数字段:

但如果要取消请求中的注释行:

//->imagesCount(true)
我得到一个错误:

Unknown column 'ads-backend-api.sda_ads.id' in 'where clause' (SQL: 
select count(*) as aggregate from `sda_ads` left join `sda_users` on `sda_users`.`id` = `sda_ads`.`creator_id` where `ad_type` <> I and `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` ) > 0
修改块: 我在请求中对ad_images_count子查询进行了注释:

$ads = Ad
    ::getByTitle($this->filter_title)
    ->onlyNoneInfo()
    ->getByStatus('A')
    ->getUserByStatus('A')
    ->imagesCount(true)
    ->leftJoin('users', 'users.id', '=', 'ads.creator_id')
    ->orderBy($this->order_by, $this->order_direction)

    ->select(
        'ads.*',
        'users.name as creator_username',
        'users.email as creator_email',
        'users.phone as creator_phone'
    )
    /*
    ->addSelect(['ad_images_count' => AdImage
        ::selectRaw('count(*)')
        ->whereColumn('ad_images.ad_id', 'ads.id')
    ])
    */
    ->offset($limit_start)
    ->take($ads_per_page)
    ->distinct()
    ->paginate($ads_per_page);
我通过日志记录修改了作用域:

public function scopeImagesCount($query, bool $check_images_count)
    {
        \Log::info('scopeImagesCount $check_images_count ::');
        \Log::info($check_images_count);

        if ($check_images_count) {
            \Log::info('CHECKING  ::');
            return $query->select(['ad_images_count' => AdImage
                ::selectRaw('count(*)')
                ->whereColumn('ad_images.ad_id', 'ads.id')
            ])->where('ad_images_count', '>', 0);
        }
        \Log::info('SKIPPED CHECKING  ::');
        return $query;
    }
我在日志文件中看到日志记录和未知列错误:

[2020-01-30 11:29:59] local.INFO: scopeImagesCount $check_images_count ::  
[2020-01-30 11:29:59] local.INFO: 1  
[2020-01-30 11:29:59] local.INFO: CHECKING  ::  
[2020-01-30 11:29:59] local.ERROR: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'ad_images_count' in 'where clause' (SQL: select count(*) as aggregate from `sda_ads` left join `sda_users` on `sda_users`.`id` = `sda_ads`.`creator_id` where `ad_type` <> I and `sda_ads`.`status` = A and `sda_users`.`status` = A and `ad_images_count` > 0) {"exception":"[object] (Illuminate\\Database\\QueryException(code: 42S22): SQLSTATE[42S22]: Column not found: 1054 Unknown column 'ad_images_count' in 'where clause' (SQL: select count(*) as aggregate from `sda_ads` left join `sda_users` on `sda_users`.`id` = `sda_ads`.`creator_id` where `ad_type` <> I and `sda_ads`.`status` = A and `sda_users`.`status` = A and `ad_images_count` > 0) at /mnt/_work_sdb8/wwwroot/lar/ads-backend-api/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669)
我看到sql生成:

   SELECT distinct `sda_ads`.*, `sda_users`.`name`     AS `creator_username`, `sda_users`.`email`     AS `creator_email`, `sda_users`.`phone`     AS `creator_phone`, (  SELECT count(*) 
    FROM `sda_ad_images` 
    WHERE `sda_ad_images`.`ad_id` = `sda_ads`.`id`)     AS `ad_images_count` 
    FROM `sda_ads` 
    LEFT JOIN `sda_users` on `sda_users`.`id` = `sda_ads`.`creator_id` 
    WHERE `ad_type` <> 'I'     AND `sda_ads`.`status` = 'A'     AND `sda_users`.`status` = 'A' 
    ORDER BY `price` asc limit 4 offset 0 
我得到一个错误:

[2020-01-31 15:27:37] local.ERROR: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'ad_images_count' in 'where clause' (SQL: select count(*) as aggregate from `sda_ads` left join `sda_users` on `sda_users`.`id` = `sda_ads`.`creator_id` where `ad_type` <> I and `sda_ads`.`status` = A and `sda_users`.`status` = A and `ad_images_count` > 0) {"exception":"[object] (Illuminate\\Database\\QueryException(code: 42S22): SQLSTATE[42S22]: Column not found: 1054 Unknown column 'ad_images_count' in 'where clause' (SQL: select count(*) as aggregate from `sda_ads` left join `sda_users` on `sda_users`.`id` = `sda_ads`.`creator_id` where `ad_type` <> I and `sda_ads`.`status` = A and `sda_users`.`status` = A and `ad_images_count` > 0) at /mnt/_work_sdb8/wwwroot/lar/ads-backend-api/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669)
但我有一个错误:

Unknown column 'ads-backend-api.sda_ads.id' in 'where clause' (SQL: 
select count(*) as aggregate from `sda_ads` left join `sda_users` on `sda_users`.`id` = `sda_ads`.`creator_id` where `ad_type` <> I and `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` ) > 0
得到:

Unknown column 'ads-backend-api.sda_ads.id' in 'where clause' (SQL: select count(*) as aggregate from `sda_ads` left join `sda_users` on `sda_users`.`id` = `sda_ads`.`creator_id` where `ad_type` <> I and `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 ) > 0
在我的数据库ads后端api中,我有带有id字段的sda_ads表

“sda”是数据库配置中的db前缀

哪条路是对的


谢谢

在您的范围内,您直接请求“ad_image_count”alais,但您必须先创建别名,就像在原始查询中一样

    public function scopeImagesCount($query, bool $check_images_count)
    {
      if ($check_images_count) {
        return $query->select(['ad_images_count' => AdImage
            ::selectRaw('count(*)')
            ->whereColumn('ad_images.ad_id', 'ads.id')
        ])->where('ad_images.ad_images_count', '>', 0);
     }
     return $query;
   }

在您的范围内,您直接请求“ad_image_count”alais,但您必须像在原始查询中一样首先创建别名

    public function scopeImagesCount($query, bool $check_images_count)
    {
      if ($check_images_count) {
        return $query->select(['ad_images_count' => AdImage
            ::selectRaw('count(*)')
            ->whereColumn('ad_images.ad_id', 'ads.id')
        ])->where('ad_images.ad_images_count', '>', 0);
     }
     return $query;
   }

请查看修改的块:尝试ad_images.ad_images_count,因为错误显示您没有列名尝试使用addSelect方法而不是select。不确定它是否有效,但为什么不试试..请看修改的块2请看修改的块3请看修改的块3请看修改的块:尝试ad_images.ad_images_计数,因为错误显示您没有列名尝试使用addSelect方法而不是select。不确定它是否有效,但为什么不试试..请看修改过的块2请看修改过的块3
Unknown column 'ads-backend-api.sda_ads.id' in 'where clause' (SQL: 
select count(*) as aggregate from `sda_ads` left join `sda_users` on `sda_users`.`id` = `sda_ads`.`creator_id` where `ad_type` <> I and `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` ) > 0
->havingRaw(' ( SELECT count(*) '.
    ' FROM `'.$prefix.'ad_images'.'` '.
    ' WHERE '.$prefix.'ad_images.ad_id = '.$prefix.'ads.id ) > ?', [0])
Unknown column 'ads-backend-api.sda_ads.id' in 'where clause' (SQL: select count(*) as aggregate from `sda_ads` left join `sda_users` on `sda_users`.`id` = `sda_ads`.`creator_id` where `ad_type` <> I and `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 ) > 0
    public function scopeImagesCount($query, bool $check_images_count)
    {
      if ($check_images_count) {
        return $query->select(['ad_images_count' => AdImage
            ::selectRaw('count(*)')
            ->whereColumn('ad_images.ad_id', 'ads.id')
        ])->where('ad_images.ad_images_count', '>', 0);
     }
     return $query;
   }