Laravel 我在使用计数时遇到未知列错误
在Laravel 6中,我有一个与相关图像计数的广告请求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
$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;
}