与模型属性的 where 条件的雄辩关系
Posted
技术标签:
【中文标题】与模型属性的 where 条件的雄辩关系【英文标题】:Eloquent relation with where condition on model attribute 【发布时间】:2015-02-07 11:41:38 【问题描述】:我有两个模型 Student
和 StudentRevision
与 Student
模型有 hasMany
与 StudentRevision
模型的关系。我在Student
中将hasMany
关系定义为
public function revisions()
return $this->hasMany(
'StudentRevision',
'sid'
);
我在 students 表(学生模型)中有一个字段,它引用 student_revisions 表中学生的当前版本。
表结构是这样的。
学生 sid srid name ....
student_revisions srid sid 批处理 ....
现在我想定义 hasOne
与 StudentRevision
模型的关系,该模型引用 current revision
与 Student
链接。目前我已将此关系定义为:
public function current()
return $this->hasOne(
'StudentRevision',
'sid'
)
->where('srid', $this->srid);
但这种关系的问题在于,$this->srid
在查询构建过程中不可用,只有在实际模型可用后才能存在。
请帮助解决这个问题。
【问题讨论】:
为什么->where('srid', $this->srid)
在里面?我从未见过有人试图定义这样的关系。
你到底想达到什么目的?我敢打赌,反向引用这些表会使事情变得过于复杂,而且它可以做得更容易,所以只需描述你需要什么。
我有一个主表 students
和辅助表 student_revisions
存储学生的多个修订。当前的学生版本通过student
表中的srid
字段链接到学生。 Current
关系/范围返回student
表中srid
列中引用的学生的修订版。现在我想从student
表中加载记录,其中current
关系/范围的student_revisions
表中的特定列与某些内容匹配。希望我很清楚。
我认为这不是一个好主意。是什么让revision
成为当前的,为什么不为此使用修订表?无论如何,对于这个设置,你需要Student belongsTo Revision
和Revision hasOne Student (current)
,所以要获取你需要whereHas
的用户。回答我的问题,如果您需要进一步的帮助,请告诉我。
【参考方案1】:
我认为您不能将其定义为关系。但是你可以这样做:
public function current()
return $this->revisions()->where('srid', $this->srid)->get();
这样您就可以通过$student->current()
访问它。你甚至可以更进一步,让relationship
更像:
public function current()
return $this->revisions()->where('srid', $this->srid);
public function getCurrent()
return $this->current()->get();
protected $appends = array('current');
这里我们为我们的属性定义了一个访问器。 Laravel Docs(向下滚动到底部)
然后我们可以这样使用它:
$student->current; // retrieves the model
$student->current(); // retrieves an instance of the query builder
【讨论】:
感谢您的意见。这是绝对正确的,你提到的方式。事实上,这工作得很好,直到我进入一个场景,我必须根据student_revision
表中的列过滤我的查询。就像现在我必须加载 section
中的 current
关系等于某事的记录。我可以在查询构建时为revisions
与whereHas
的关系做到这一点,但是current
范围/关系呢?以上是关于与模型属性的 where 条件的雄辩关系的主要内容,如果未能解决你的问题,请参考以下文章