Laravel 4 拉威尔4号>;快速加载>;orderBy嵌套关系

Laravel 4 拉威尔4号>;快速加载>;orderBy嵌套关系,laravel-4,eager-loading,Laravel 4,Eager Loading,我有三个模型 1-画廊 class Gallery extends \Eloquent { public function media() { return $this->hasMany('Media'); } } 2-媒体 class Media extends \Eloquent { protected $table = 'media'; public function labels() { re

我有三个模型

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

如果您只想按
标签
关系订购,这将起作用:

$gallery = Gallery::with(array(
            'labels' => function ($query) 
                { $query->orderBy('name', 'asc'); },
            'labels.media'
            ))->first();
如果要控制嵌套关系的每一级排序(即按名称对标签进行排序,并按列对媒体进行排序),可以执行以下操作:

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

如果您只想按
标签
关系订购,这将起作用:

$gallery = Gallery::with(array(
            'labels' => function ($query) 
                { $query->orderBy('name', 'asc'); },
            'labels.media'
            ))->first();
如果要控制嵌套关系的每一级排序(即按名称对标签进行排序,并按列对媒体进行排序),可以执行以下操作:

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

看起来您需要将标签加入到图库中,并对主查询进行排序


看起来您需要将标签加入到您的图库中,并对主查询进行排序


如果您有更多嵌套

$this->data['user_posts'] = User_posts::with(['likes', 'comments' => function($query) {
    $query->orderBy('created_at', 'DESC');
},
'comments.replies' => function ($query) { 
    $query->orderBy('created_at', 'DESC'); }
])->where('status', 1)->orderBy('created_at', 'DESC')->get();

如果您有更多嵌套的订单

$this->data['user_posts'] = User_posts::with(['likes', 'comments' => function($query) {
    $query->orderBy('created_at', 'DESC');
},
'comments.replies' => function ($query) { 
    $query->orderBy('created_at', 'DESC'); }
])->where('status', 1)->orderBy('created_at', 'DESC')->get();

如果标签与库无关,该怎么办?正如您在“我的模型”中看到的,媒体属于标签,而图库有许多媒体-有没有一种方法可以实现给定的输出示例,而不将标签与图库关联?如果标签与图库无关,该怎么办?正如您在我的模型中所看到的,媒体属于标签,而图库有许多媒体-有没有一种方法可以在不将标签与图库关联的情况下实现给定的输出示例?我认为您的
媒体
属于('label')
是不正确的。这意味着每个
媒体
只有一个
标签
。相反,您应该使用
belongTomany('Label')
,因为每个
媒体
可能有多个
标签。感谢您指出这一点。我的输出示例有点混乱,但它正是我想要的:每个媒体一次属于一个标签,而不是多个。我优化了输出示例我认为您的
媒体
属于('Label')
是不正确的。这意味着每个
媒体
只有一个
标签
。相反,您应该使用
belongTomany('Label')
,因为每个
媒体
可能有多个
标签。感谢您指出这一点。我的输出示例有点混乱,但它正是我想要的:每个媒体一次属于一个标签,而不是多个。我优化了输出示例