Laravel 4>渴望加载> orderBy嵌套关系

时间:2014-11-01 18:08:23

标签: laravel-4 eager-loading

我有3个模特

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

3 个答案:

答案 0 :(得分:4)

如果您只想按labels关系订购,这将有效:

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

如果您希望控制嵌套关系的每个级别的排序(即按名称对labels进行排序,并按列{media进行排序1}}),你可以这样做:

media_name

答案 1 :(得分:1)

如果你有更多的嵌套排序

$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();

答案 2 :(得分:0)

您似乎需要将标签加入到图库中,然后按主要查询进行订购。

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