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)
您可以根据最新值加入表:
->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)
在您的项目模型中,使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 风格保持一致,它应该命名为单数,就像我在这段代码中使用的那样)