В Laravel 6 У меня есть таблица комментариев с полем parent_id:
id bigint(20) unsigned
ad_id bigint(20) unsigned
parent_ad_comment_id bigint(20) unsigned NULL
user_id int(10) unsigned NULL
approved tinyint(1) [0]
comment mediumtext
rating tinyint(3) unsigned NULL
created_at timestamp [CURRENT_TIMESTAMP]
И я хочу получить только root ите с количеством дочерних данных:
$adComments = AdComment
::getByAdId($ad_id)
->withCount('children')
->whereNull('parent_ad_comment_id')
->get();
с определенной областью действия:
public function scopeGetByAdId($query, $ad_id= null)
{
if (!empty($ad_id)) {
if ( is_array($ad_id) ) {
$query->whereIn(with(new AdComment)->getTable().'.ad_id', $ad_id);
} else {
$query->where(with(new AdComment)->getTable().'.ad_id', $ad_id);
}
}
return $query;
}
и отношением:
public function children()
{
return $this->hasMany('App\AdComment', 'parent_ad_comment_id', 'id');
}
Но, глядя на sql, я ожидаю 1 ожидаемый запрос и еще несколько запросов для любой строки поиска в первом запросе :
SELECT `sda_ad_comments`.*, ( SELECT count(*)
FROM `sda_ad_comments` AS `sda_laravel_reserved_0`
WHERE `sda_ad_comments`.`id` = `sda_laravel_reserved_0`.`parent_ad_comment_id`
ORDER BY `id` desc) AS `children_count`
FROM `sda_ad_comments`
WHERE `sda_ad_comments`.`ad_id` = '1' AND `parent_ad_comment_id` is null
ORDER BY `id` desc
...
SELECT *
FROM `sda_ad_comments`
WHERE `sda_ad_comments`.`parent_ad_comment_id` = '9' AND `sda_ad_comments`.`parent_ad_comment_id` is not null
ORDER BY `id` desc
SELECT *
FROM `sda_ad_comments`
WHERE `sda_ad_comments`.`parent_ad_comment_id` = '8' AND `sda_ad_comments`.`parent_ad_comment_id` is not null
ORDER BY `id` desc
и я вижу массив детей, который я не ожидал увидеть. Почему я получил данные, которые мне не нужны, и как от них избавиться?
Спасибо!