从本地 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();
在我的 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();