使用laravel按属性排序嵌套关系

时间:2014-07-12 19:32:46

标签: php sorting laravel eloquent eager-loading

您好我在尝试按关系属性对集合进行排序。

这是我的模特

class Song extends \Eloquent {
    protected $fillable = ['title', 'year'];
    public function artist(){
            return $this->hasOne('Artist','id', 'artist_id');
    }
}

class SongDance extends \Eloquent {
    protected $table = 'song_dances';
        protected $fillable = ['rating'];
    public function dance(){
        return $this->belongsTo('Dance', 'dance_id');
    }
    public function song(){
        return $this->belongsTo('Song', 'song_id');
    }
}

class Dance extends \Eloquent {
        protected $fillable = ['name'];
    public function song_dances(){
        return $this->hasMany('SongDance','dance_id','id');
    }
    public function songs(){
        return $this->belongsToMany('Song', 'song_dances', 'dance_id', 'song_id');
    }
}

这就是我现在的距离:

$dance = Dance::find(1);
$songs = $dance->songs()
    ->with('artist')->whereHas('artist', function ($query) {
        $query->where('urlName','LIKE','%robbie%');})
    ->where('song_dances.rating', '=', $rating)
    ->orderBy('songs.title','asc')
    ->where('songs.year', '=', 2012)
    ->get();

是的,我只是可以在查询中添加 - > sortBy(' artist.name'); ,但结果集可能非常大(约6000项)因此我更喜欢数据库分类。

有可能这样做吗?

1 个答案:

答案 0 :(得分:1)

由于Eloquent的关系都是单独查询的(不是JOIN s),因此无法在数据库层中实现所需。您唯一能做的就是在应用程序代码中对集合进行排序,您已经解雇了该集合。

如果您觉得必须在数据库中对其进行排序,那么您应该编写自己的连接查询,而不是依赖于Eloquent的关系。