Laravel morphedByMany возвращает все записи, где условие и количество - PullRequest
0 голосов
/ 31 октября 2018
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` = ?))

enter image description here

1 Ответ

0 голосов
/ 31 октября 2018

withCount('products') должен быть вызван первым, а distinct() должен быть последним перед ->get()->toArray().

Попробуйте (не проверено):

$tags = \App\Tag::withCount('products')->where( function( $query ){
                   $query->whereHas('products', function ( $subquery ){
                       $subquery->where('publish', 1 );
                   })->get()->toArray();
                 })->distinct()->get()->toArray();
...