Laravel 4 > 急切加载 > orderBy 嵌套关系

Kri*_*sto 1 eager-loading laravel-4

我有 3 个模型

1 - 画廊

class Gallery extends \Eloquent {

    public function media()
    {
        return $this->hasMany('Media');
    }

}
Run Code Online (Sandbox Code Playgroud)

2- 媒体

class Media extends \Eloquent {

    protected $table = 'media';

    public function labels()
    {
        return $this->belongsTo('Label');
    }

}
Run Code Online (Sandbox Code Playgroud)

3 - 标签

class Label extends \Eloquent {

    public function media()
    {
        return $this->hasMany('Media');
    }

}
Run Code Online (Sandbox Code Playgroud)

我正在尝试加载包含所有媒体的特定图库。媒体应按相关标签分组并按标签名称列排序。

这不起作用:

$gallery = Gallery::with( [ 'media.labels' => function( $q )
{
    $q->orderBy( 'name', 'desc' );

} ] )->where( 'name', 'Gallery1' )->first();
Run Code Online (Sandbox Code Playgroud)

举例说明如何对输出进行排序:

Gallery1
    ALabel
        Media1
        Media2
    BLabel
        Media3
    CLabel
        Media4
        Media5
        Media6
Run Code Online (Sandbox Code Playgroud)

dam*_*ani 5

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

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

如果您想控制嵌套关系的每个级别的排序(即labels按名称排序,并按media列排序media_name),您可以执行以下操作:

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