从本地 Eloquent 范围返回错误的 ID

Wrong ID returned from local Eloquent scope

在我的 Laravel 项目中,我有一个模型(和一个基础 table)用于课程。现在我正在尝试为 returning 特定用户已完成的所有课程编写本地范围。 "finished" 的定义是在名为 "lesson_results" 的 table 中存在一行,其中包含本课的 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() 时,我会为该用户提供正确的课程。然而,returned 中的课程全都有错误的 ID!我看到的 ID 是来自 lesson_results table 的 ID。因此,当我检查 returned 项目之一的 $lesson->id 时,我没有从该课程中获得 ID,而是从 lesson_results table 中相应的行中获得 ID .

我已经签入 mysql 并且从 Laravel 发送的完整查询如下

select * from `lessons` inner join `lesson_results` on `lesson_results`.`lesson_id` = `lessons`.`id` and `user_id` = 53

此查询 DO return 名为 id 的两列(来自课程 table 的一列和来自 lesson_results table 的一列)似乎 Laravel 使用错误的结果 returned.

我不知道我是不是用错了方法还是哪里有错误?

这是在 Laravel 7.6.1.

编辑:好的,我想我现在真的解决了。虽然不确定它是真正的解决方案还是只是一种解决方法。我添加了一个 select() 调用,所以 return 行现在是

return $query->select('lessons.*')->join('lesson_results', function($join) use($user)

...这使得它只是 return 课程 table 中的内容。但真的需要吗?

一个相同的列名将被另一个覆盖。

解决方案 1:

用列指定 table,如果另一个 table 的列具有相同的列名,则为其指定别名。

Lesson::finished($user)->select('lessons.*', 'lesson_results.id AS lesson_result_id', 'lesson_results.column1', 'lesson_results.column2',...)->get();

解决方案 2:

或者你可以使用Eloquent-Builder eager-loading whereHas,(假设你已经建立了模型Lesson和模型LessonResult之间的关系)

public function scopeFinished($query, User $user)
{
    return $query->whereHas('lessonResults', function($query) use($user)
        {
            $query->where("user_id", $user->id);
        });
}

所以你可以得到这样的教训:

Lesson::finished($user)->get();