【发布时间】:2022-01-25 08:01:09
【问题描述】:
我有一个名为patients 的父表,它与一个名为notes 的子表具有一对多的关系。 (即一名患者可以有多个笔记)。如果给出注释,我想为同一患者找到其他注释。注释通过名为patient_id 的fk 与患者相关。
在 SQL 中,我会这样做:
SELECT * FROM notes WHERE patient_id={note.patient_id} AND id <> {note.id}
在 Eloquent 中,我有这个:
class Note extends Model
{
public function otherEncounterNotes()
{
return $this->hasMany('App\Note', 'patient_id', 'patient_id')->where('id', '<>',$this->id);
}
...
在我的数据库中,id=1 的患者有两个 id 为 1 和 2 的笔记,所以如果我寻找笔记 id 1 的兄弟姐妹,我应该得到笔记 id 2。
当我使用find() 时,它按预期工作,但是当我使用where() 时,它返回原始注释而不是兄弟。有什么想法吗?
>>> Note::find(1)->otherEncounterNotes->pluck('id')
=> Illuminate\Support\Collection {#5542
all: [
2,
],
}
>>> Note::where('id',1)->with('otherEncounterNotes')->pluck('id')
=> Illuminate\Support\Collection {#5526
all: [
1,
],
}
【问题讨论】:
-
find(1)正在从数据库中返回模型,因此当调用关系方法时,otherEncounterNotes, ($this->id) 有一个值,因为该方法是在该实例上直接调用的,而您正在从返回的集合中提取...第二个是直接从表中提取 [不管任何关系](调用with急切加载关系对基本结果没有影响) -
@lagbox - 有什么方法可以急切加载涉及 id 的逻辑?
-
不,因为急切加载使用新的非现有模型从关系方法中获取构建器,它不会调用从具有属性的数据库中检索到的模型
-
我能做的最好的就是
Note::where('id',1)->get(['id','patient_id'])->each->append('otherEncounterNotes')
标签: php laravel eloquent siblings