在eager load laravel eloquent

时间:2017-01-08 09:38:18

标签: php laravel

我有一个Conversation这样的模型:

class Conversation extends Model
{
        protected $primaryKey = 'conversation_id';
        public function questions (){
            return $this->hasMany('App\Question','conversation_id','conversation_id');
        }

    public function latestQuestion ()
    {
        return $this->hasOne('App\Question','conversation_id','conversation_id')
            ->orderBy('created_at', 'desc');
    }

}

这样的Question模型:

class Question extends Model
    {    
        protected $primaryKey = 'question_id';

        public function conversation ()
        {
            return $this->belongsTo('App\Conversation', 'conversation_id', 'conversation_id');
        }
}

正如您所看到的,每个对话都可以有一些问题。

此外,Conversation模型具有latestQuestion关系,可以获取该对话的最新问题。

现在,我想列出所有对话及其最新问题。

为此,我写道:

$conversations =
    Conversation::
    with('latestQuestion')
    ->orderBy('created_at','desc')
    ->get();

以上代码,按created_at字段对对话进行排序。

但我想列出一个对话列表,将新问题的对话放在列表之上。事实上我想根据最新问题created_at字段订购对话但是我不知道我该怎么做?

1 个答案:

答案 0 :(得分:1)

您需要使用加入查询。因为Eager Loading只会带来基表并稍后获取引用的表记录

 Conversation::join('questions', 'conversations.conversation_id', '=', 'questions.conversation_id')
            ->orderBy('questions.created_at','Desc')
            ->groupBy('conversations.conversation_id')
            ->get();