2014-06-04 2 views
0

У меня есть следующий сценарий:Query Logic: Группировка тэгов их подсчета и другого параметра

Столы

  • 'сообщений (для краткости опускаем)

  • «теги '

    'id', 'name', 'kind' (kind = $table->enum('kind', array('male', 'female'))) 
    
  • 'post_tag' (сводная таблица)

    'id', 'post_id', 'tag_id' 
    



Модели

  • Models\Post.php

    public function tags() 
    { 
        return $this->belongsToMany('Models\Tag'); 
    } 
    
  • Models\Tag.php

    public function posts() 
    { 
        return $this->belongsToMany('Models\Post'); 
    } 
    



Контроллер

$slug = 'hello-world'; 
$post = $this->posts->getFirstBy('slug', $slug); 
$tags = $post->tags; 



Пример Выход$tags

array (size=7) 
    0 => 
    array (size=8) 
     'id' => int 1 
     'name' => string 'rough' (length=5) 
     'kind' => string 'male' (length=4) 
    1 => 
    array (size=8) 
     'id' => int 2 
     'name' => string 'cosy' (length=4) 
     'kind' => string 'female' (length=6) 
    2 => 
    array (size=8) 
     'id' => int 2 
     'name' => string 'cosy' (length=4) 
     'kind' => string 'female' (length=6) 
    3 => 
    array (size=8) 
     'id' => int 2 
     'name' => string 'cosy' (length=4) 
     'kind' => string 'female' (length=6) 
    4 => 
    array (size=8) 
     'id' => int 3 
     'name' => string 'sensual' (length=7) 
     'kind' => string 'female' (length=6) 
    5 => 
    array (size=8) 
     'id' => int 4 
     'name' => string 'hard' (length=4) 
     'kind' => string 'male' (length=4) 
    6 => 
    array (size=8) 
     'id' => int 1 
     'name' => string 'rough' (length=4) 
     'kind' => string 'male' (length=4) 


В моем шаблоне я хотел бы, чтобы сгруппировать данные, как так:

мужской

- rough (2 occurances) 
- hard (1 occurance) 

женщина

- cosy (3 occurances) 
- sensual (1 occurance) 


Обратите внимание, что порядок - это самое большое количество событий до самого низкого уровня. Итак, мне не только нужно иметь доступ к счету тегов, но также мне нужно их сгруппировать по kind (мужчина и женщина в этом примере).

Какой запрос мне нужно выполнить для получения желаемого результата? К сожалению, я не очень хорошо разбираюсь в формулировках MySQL. Заранее спасибо!

ответ

0

Нечто подобное может работать (не 100% уверен, потому что не проверял, но дать ему попробовать):

$u = Posts::with(array('tags' => function($query) { 
    $query->select(DB::raw('count(name) as total')) 
      ->groupBy('kind') 
      ->orderBy('total', 'desc'); 
}))->whereSlug('hello-world')->first(); 

Пожалуйста, Лемм знать результат.

Смежные вопросы