2014-11-01 2 views
1

I've получила 3 ​​МоделиLaravel 4> жадная загрузка> OrderBy вложенные отношения

1 - галерея

class Gallery extends \Eloquent { 

    public function media() 
    { 
     return $this->hasMany('Media'); 
    } 

} 

2- Медиа

class Media extends \Eloquent { 

    protected $table = 'media'; 

    public function labels() 
    { 
     return $this->belongsTo('Label'); 
    } 

} 

3 - Этикетка

class Label extends \Eloquent { 

    public function media() 
    { 
     return $this->hasMany('Media'); 
    } 

} 

Я пытаюсь загрузить определенную Галерею со всем этим Медиа. Средства массовой информации должны быть сгруппированы с помощью соответствующих ярлыков и упорядочены по столбцу «Названия ярлыков».

Это не правда рабочая:

$gallery = Gallery::with([ 'media.labels' => function($q) 
{ 
    $q->orderBy('name', 'desc'); 

} ])->where('name', 'Gallery1')->first(); 

Чтобы дать пример, как результат должен быть отсортирован:

Gallery1 
    ALabel 
     Media1 
     Media2 
    BLabel 
     Media3 
    CLabel 
     Media4 
     Media5 
     Media6 
+0

Я не думаю, что это правильно, что ваш '' Media' belongsTo ('Метка') '. Это означает, что каждый «Медиа» имеет только одну «Метка». Скорее вы должны использовать 'attribToMany ('Label')', так как каждый 'Media' может иметь несколько' Label'. – Andy

+0

Спасибо, что указали это. Мой вывод Пример был немного запутанным, но это именно то, что я хочу: каждый носитель принадлежит одному ярлыку сразу - не много. Я оптимизировал вывод Пример – Kristo

ответ

3

Если вы хотите заказать только в labels отношении, это будет работать:

$gallery = Gallery::with(array(
      'labels' => function ($query) 
       { $query->orderBy('name', 'asc'); }, 
      'labels.media' 
      ))->first(); 

Если вы хотите, чтобы иметь контроль над сортировкой для каждый уровень вложенных отношений (т. сортировать labels по их имени и рода media колонкой media_name), вы можете сделать это:

$gallery = Gallery::with(array(
      'labels' => function ($query) 
       { $query->orderBy('name', 'asc'); }, 
      'labels.media' => function ($query) 
       { $query->orderBy('media_name', 'asc'); } 
      ))->first(); 
+0

Что делать, если метки не связаны с галереями? Как вы можете видеть, в моих моделях носители принадлежат к метке, а в галерее много носителей - существует ли способ получить данный пример вывода без привязки ярлыков к галереям? – Kristo

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