Laravel 4>急切装载> ORDERBY嵌套关系

问题描述:

从来就得到了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

如果你只想通过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

看起来你需要将这些标签加入到您的画廊,并通过对主查询做一个订单。

https://stackoverflow.com/a/18882219/3681253