Laravel雄辩地从联接表中选择了最新的行

Ale*_*lex 7 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();
Run Code Online (Sandbox Code Playgroud)

Die*_*rik 8

您可以根据最新值加入表:

->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)"));
Run Code Online (Sandbox Code Playgroud)

如果您还想在 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'))
Run Code Online (Sandbox Code Playgroud)


ber*_*err 0

在您的项目模型中,使notes关系函数如下所示:

public function notes() {
  return $this->hasMany('Note');
}
Run Code Online (Sandbox Code Playgroud)

orderBy然后,您可以通过链接和来获取主键为 1 的项目的最新注释first

Project::find(1)->notes()->orderBy('created_at', 'desc')->first();
Run Code Online (Sandbox Code Playgroud)

另外,你的笔记表叫“Note”还是“Notes”?(与 Laravel 风格保持一致,它应该命名为单数,就像我在这段代码中使用的那样)