Laravel最新不工作(未出现在我的SQL查询中)

roqulrg3  于 2022-12-14  发布在  其他
关注(0)|答案(2)|浏览(147)

所以我有一个学生模型,里面有这个函数:

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

但我的查询中仍然没有显示任何内容。

2ledvvac

2ledvvac1#

如果你深入挖掘whereHas()关系,它调用has()方法,然后如果你寻找has()方法,你会看到getRelationWithoutConstraints()方法,这意味着它会调用关系,但会删除附加到它的所有约束,只调用基本查询示例:

public function latestStatus()
{
    return $this->hasOne(StatusStudent::class)->latest(); // the latest() will be removed in the query if you call the `latestStatus` using the `whereHas() or has()`
}

因此,如果您像使用whereHas()一样使用它:

"select * from `students` where exists (select * from `status_student` where `students`.`id` = `status_student`.`student_id` and `status_id` = ?)

它将返回没有latest()的查询。
与其这样做,不如这样做:

学生模型

public function status() : HasOne
{
    return $this->hasOne(StatusStudent::class);
}

控制器

$student = Student::findOrFail(1);

$student->whereHas('status', function($query) {
    $query->where('status_id', 1)
        ->latest();
})

但由于关系定义为one-to-one

$student = Student::findOrFail(1);

$student->load('status');

$student = Student::findOrFail(1)->status()->get();

也许你想得到最新的所有状态。

StudentStatus::query()->latest()->get();
ttygqcqt

ttygqcqt2#

comment by @matticustard中所述,
findOrFail()会传回模型,而不是查询产生器。
使用where('id', 1)代替findOrFail(1)

相关问题