Laravel雄辩地从连接表中选择最近的行

时间:2014-06-12 13:40:11

标签: join laravel eloquent

我有两个表,Project和Projectnote

项目和项目说明之间存在一对多的关系。

我希望能够列出我的项目,并根据created_at日期选择最新的项目说明。

这可以在Eloquent中做到,我无法弄明白。

感谢您的帮助!

编辑:到目前为止,我有一个连接两个表的基本查询(下面)。但是,这只选择存在注释的项目,并且我得到多个行,每个项目有几个注释。

$projects = Project::join('projectnotes', 'projectnotes.project_id', '=', 'projects.id')
->select(array('projects.*', 'projectnotes.note as note'))
->get();

2 个答案:

答案 0 :(得分:1)

您可以在表格中加入最新值:

->join('t1', function($join) {
        $join->on('t1.t2_id', '=', 't2.id')
             ->on('t1.id', '=', DB::raw("(select max(id) from t1 WHERE t1.t2_id = t2.id)"));

如果您还想加入t1没有值的地方,请使用leftJoin。在你的情况下,这将是这样的:

$projects = Project::leftJoin('projectnotes', function($join) { 
        $join->on('projectnotes.project_id', '=', 'projects.id')
             ->on('projectnotes.id', '=', DB::raw("(SELECT max(id) from projectnotes WHERE projectnotes.project_id = projects.id)")); 
        })
        ->select(array('projects.*', 'projectnotes.note as note'))

答案 1 :(得分:0)

在项目模型中,使notes关系函数看起来像:

public function notes() {
  return $this->hasMany('Note');
}

然后,您可以通过链接orderByfirst来获取包含主键1的项目的最新注释:

Project::find(1)->notes()->orderBy('created_at', 'desc')->first();

另外,您的记事表是否被称为'注意'或者'笔记'? (保持Laravel风格,它应该在我的代码中以单数形式命名)