所以我有一个学生模型,里面有这个函数:
public function latestStatus()
{
return $this->hasOne(StatusStudent::class)->latest();
}
那么我就用这个latestStatus()执行一个查询
$query = Student::findOrFail(1);
$query = $query->whereHas('latestStatus', function($query) use ($statusuri) {
$query->where('status_id', 1);
});
dd($query->toSql());
toSql()函数返回:
"select * from `students` where exists (select * from `status_student` where `students`.`id` = `status_student`.`student_id` and `status_id` = ?)
如同忽略latest()一样。
为什么latest()不向查询添加任何内容?
- 谢谢-谢谢
编辑:
我尝试添加selectRaw,例如:
public function latestStatus()
{
return $this->hasOne(StatusStudent::class)->selectRaw('MAX(status_student.id)');
}
但我的查询中仍然没有显示任何内容。
2条答案
按热度按时间2ledvvac1#
如果你深入挖掘
whereHas()
关系,它调用has()
方法,然后如果你寻找has()
方法,你会看到getRelationWithoutConstraints()
方法,这意味着它会调用关系,但会删除附加到它的所有约束,只调用基本查询示例:因此,如果您像使用
whereHas()
一样使用它:它将返回没有
latest()
的查询。与其这样做,不如这样做:
学生模型
控制器
但由于关系定义为
one-to-one
:或
也许你想得到最新的所有状态。
ttygqcqt2#
如comment by @matticustard中所述,
findOrFail()
会传回模型,而不是查询产生器。使用
where('id', 1)
代替findOrFail(1)