2014-11-01 70 views
1

從來就得到了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'); 
    } 

} 

我試圖加載一個特定的畫廊的媒體。媒體應按照關聯的標籤進行分組,並按標籤名稱列排序。

這isn't工作:

$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'屬於關聯( '標籤')'。這意味着每個「媒體」只有一個「標籤」。相反,你應該使用'belongsToMany('Label')',因爲每個'Media'可能有多個'Label'。 – Andy 2015-02-10 19:34:14

+0

感謝您指出這一點。我的輸出示例有點令人困惑,但它正是我想要的:每個媒體同時屬於一個標籤 - 不是多個。我優化了輸出示例 – Kristo 2015-02-11 22:12:30

回答

3

如果你只想通過labels關係命令,這將工作:

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

如果你想控制排序每個嵌套關係的級別(即由列media_name)排序labels他們的名字和排序media,你可以這樣做:

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

如果標籤與畫廊無關,該怎麼辦?正如你可以在我的模型中看到的媒體屬於標籤和畫廊有很多媒體 - 是否有一種方法來實現給定的輸出示例,而不會將標籤與畫廊相關聯? – Kristo 2014-11-02 00:45:20