Table 1: products: id, title, publish,created_at
Table 2: tags: id,name,created_at
Table 3: taggable: id,tag_id,taggable_type,taggable_id
Я хочу получить все отличные теги с порядком подсчета по имени.
Я хочу, чтобы он возвращал массив следующим образом:
[
['name1'=>'value1','count'=>3],
['name2'=>'value2','count'=>3]
]
Я пытался сделать это так:
$tags = \App\Tag::distinct()->where( function( $query ){
$query->whereHas('products', function ( $subquery ){
$subquery->where('publish', 1 );
})->get()->toarray();
})->withCount('products')->get()->toarray();
но он возвращает все (product
) теги и все значения products_count
равны 1, например:
[...],
[▼
"id" => 75
"name" => "test1"
"created_at" => "2018-10-30 18:49:51"
"products_count" => 1
],
[...]
...
EDIT:
SELECT DISTINCT `tags`.*,
(SELECT count(*)
FROM `products`
INNER JOIN `taggables` ON `products`.`id` = `taggables`.`taggable_id`
WHERE `tags`.`id` = `taggables`.`tag_id`
AND `taggables`.`taggable_type` = ?) AS `products_count`
FROM `tags`
WHERE (EXISTS
(SELECT *
FROM `products`
INNER JOIN `taggables` ON `products`.`id` =`taggables`.`taggable_id`
WHERE `tags`.`id` = `taggables`.`tag_id`
AND `taggables`.`taggable_type` = ?
AND `publish` = ?))