【问题标题】:Laravel 4 > eager loading > orderBy nested relationshipLaravel 4 > 急切加载 > orderBy 嵌套关系
【发布时间】:2014-12-28 18:17:20
【问题描述】:

我有 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

【问题讨论】:

  • 我认为您的Media belongsTo('Label') 不正确。这意味着每个Media 只有一个Label。相反,您应该使用belongsToMany('Label'),因为每个Media 可能有多个Labels。
  • 感谢您指出这一点。我的输出示例有点令人困惑,但这正是我想要的:每个媒体一次属于一个标签 - 而不是多个。我优化了输出示例

标签: laravel-4 eager-loading


【解决方案1】:

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

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

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

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

【讨论】:

  • 如果标签与画廊无关怎么办?正如您在我的模型中看到的,媒体属于标签,而画廊有很多媒体 - 有没有办法在不将标签与画廊相关联的情况下实现给定的输出示例?
【解决方案2】:

如果你有更多的嵌套排序

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      相关资源
      最近更新 更多