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

Join Laravel雄辩地从联接表中选择最近的行,join,laravel,eloquent,Join,Laravel,Eloquent,我有两张表,Project和Projectnote project和projectnote之间存在一对多关系 我希望能够列出我的项目,并根据创建日期选择最新的项目注释 这有可能做到吗?我想不出来 谢谢你的帮助 编辑:到目前为止,我有一个连接两个表的基本查询(如下)。但是,这只选择存在注释的项目,并且我得到多行,其中每个项目有多个注释 $projects = Project::join('projectnotes', 'projectnotes.project_id', '=', 'project

我有两张表,Project和Projectnote

project和projectnote之间存在一对多关系

我希望能够列出我的项目,并根据创建日期选择最新的项目注释

这有可能做到吗?我想不出来

谢谢你的帮助

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

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

在项目模型中,使
notes
关系函数类似于:

public function notes() {
  return $this->hasMany('Note');
}
然后,您可以通过链接
orderBy
first
来获取带有主键1的项目的最新注释:

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

另外,您的note表是称为“note”还是“Notes”?(与Laravel风格保持一致,它应该被命名为singular,因为我在这段代码中使用了它)

您可以在最新值上加入表:

->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'))

是的,这在雄辩中是可能的。您尝试过什么?在上面编辑了我到目前为止的内容。如果您试图通过快速加载每个项目获得X个注释,那么使用雄辩且非常复杂的SQL是不可能的。否则(意味着加载所有相关注释)只需
$projects=Project::with(['projectNotes'=>函数($q){$q->latest();}])->get()
(或者不管它是什么关系名称而不是
projectNotes
)更正了post以正确反映表名。您需要更正此问题:
Project::find(1)->notes->orderBy…
to
。->notes()->orderBy..
否则将调用
集合上不存在的
orderBy
方法