【发布时间】:2020-04-15 13:08:18
【问题描述】:
在我的 Laravel 项目中,我有一个课程模型(和一个基础表)。现在我正在尝试编写一个本地范围来返回特定用户已完成的所有课程。 “完成”的定义是在一个名为“lesson_results”的表中存在一行,其中包含本课的 ID 和用户 ID。
我的范围目前看起来像这样:
public function scopeFinished($query, User $user)
{
return $query->join('lesson_results', function($join) use($user)
{
$join->on('lesson_results.lesson_id', '=', 'lessons.id')
->where("user_id", $user->id);
});
}
这有点工作。当我执行 Lesson::finished($user)->get() 时,我会为该用户获取正确的课程。但是返回的集合中的课程都有错误的ID!我看到的 ID 是来自课程结果表的 ID。因此,当我从其中一个返回的项目中检查 $lesson->id 时,我没有从该课程中获得 ID,而是从 course_results 表中的相应行中获得 ID。
我已经检查了 mysql,从 Laravel 发送的完整查询如下
select * from `lessons` inner join `lesson_results` on `lesson_results`.`lesson_id` = `lessons`.`id` and `user_id` = 53
这个查询确实返回了两列名为 id 的列(一列来自课程表和一列来自课程结果表),似乎 Laravel 使用了错误的一列作为返回的结果。
我不知道我是否以错误的方式处理这个问题,或者它是否是某个地方的错误?
这是在 Laravel 7.6.1 上。
edit:好的,我想我现在真的解决了。不确定它是真正的解决方案还是只是一种解决方法。我添加了一个 select() 调用,所以现在返回行是
return $query->select('lessons.*')->join('lesson_results', function($join) use($user)
...这使得它只返回课程表中的内容。但这真的需要吗?
【问题讨论】:
标签: laravel eloquent laravel-7