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
答
如果你只想通过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
我不认为这是正确的,你的''Media'属于关联( '标签')'。这意味着每个“媒体”只有一个“标签”。相反,你应该使用'belongsToMany('Label')',因为每个'Media'可能有多个'Label'。 – Andy 2015-02-10 19:34:14
感谢您指出这一点。我的输出示例有点令人困惑,但它正是我想要的:每个媒体同时属于一个标签 - 不是多个。我优化了输出示例 – Kristo 2015-02-11 22:12:30