Merhaba with veya withWhereHas ile tek başına sorgu yaptığımda işlem doğru şekilde çalışıyor. Ekstra sorguları ekliyor. Ancak sorguların içine gitmeye çalıştığımda tam olarak çalışmıyor.
Şimdi aşağıdaki gelen kategoride var olan articles ve onu giren kullanıcı ve kategori bilgisini almaya çalışıyorum. Hepsinde de aynı anda verinin aktif olmasını istiyorum. Bu şekilde yaptığımda articles.user ve articles.category sorgularına status sorgulama kodunu ekliyor ancak ilk kısımda articles sorgularken aktif olanları getir kısmını yapmıyor. Yazdığı sorguları da yazdım. Bilgisi olan, fikri olan yardımcı olursa memnun olurum.
$category = BlogCategory::query()
->withWhereHas('articles', fn ($query) => $query->active())
->withWhereHas('articles.user', fn ($query) => $query->select("id", "name", "email")->active())
->withWhereHas('articles.category', fn ($query) => $query->active())
->where("slug->{$locale}", $slug)
->active()
->firstOrFail();
Tamamının kontrolü
SELECT *
FROM `blog_categories`
WHERE EXISTS (
SELECT *
FROM `articles`
WHERE `blog_categories`.`id` = `articles`.`blog_category_id`
AND `status` = 1
)
AND EXISTS (
SELECT *
FROM `articles`
WHERE `blog_categories`.`id` = `articles`.`blog_category_id`
AND EXISTS (
SELECT `id`
,`name`
,`email`
FROM `users`
WHERE `articles`.`user_id` = `users`.`id`
AND `status` = 1
)
)
AND EXISTS (
SELECT *
FROM `articles`
WHERE `blog_categories`.`id` = `articles`.`blog_category_id`
AND EXISTS (
SELECT *
FROM `blog_categories`
WHERE `articles`.`blog_category_id` = `blog_categories`.`id`
AND `status` = 1
)
)
AND json_unquote(json_extract(`slug`, '$."tr"')) = 'php'
AND `status` = 1 limit 1
// burada sorgu sonuna status=1 eklemesi gerekirken eklemiyor.
select * from `articles` where `articles`.`blog_category_id` in (1)
select `id`, `name`, `email` from `users` where `users`.`id` in (1, 2) and `status` = 1
select * from `blog_categories` where `blog_categories`.`id` in (1) and `status` = 1