Php Laravel雄辩库-查询是否给出意外结果?
我正在使用laravel雄辩的查询来获得属于某个系的所有学生的结果。 这种关系是这样的: 每个系都有课。 每个班都有学生 如果我们在MySQL上写这篇文章,我们可以有两个版本: 假设我们想要第五系的学生 一,Php Laravel雄辩库-查询是否给出意外结果?,php,laravel-5,eloquent,repository-pattern,Php,Laravel 5,Eloquent,Repository Pattern,我正在使用laravel雄辩的查询来获得属于某个系的所有学生的结果。 这种关系是这样的: 每个系都有课。 每个班都有学生 如果我们在MySQL上写这篇文章,我们可以有两个版本: 假设我们想要第五系的学生 一, 从类中选择* class.id=student.class\u id上的内部联接学生 其中class.department_id=5; 等效Laravel雄辩查询: return$classRepo->where(['department\u id'=>5]) ->选择(['id','d
从类中选择*
class.id=student.class\u id上的内部联接学生
其中class.department_id=5;
等效Laravel雄辩查询:
return$classRepo->where(['department\u id'=>5])
->选择(['id','department\u id'])
->与(['students'])一起
->get();
二,
select*from student
class.id=student.class\u id上的内部联接类
其中class.department_id=5;
等效Laravel雄辩查询:
返回$studentRepo
->使用(['class'=>函数($query){
$query->select(['id','department\u id'])
->其中(['department_id'=>5]);
}])
->get();
出乎意料的是,第一个版本的结果是:
[
{
"id": 3,
"department_id" : 5,
"students": [
{
"id": 61060,
"name" : "Mark"
},
{
"id": 61061,
"name" : "Tony"
}
]
}
]
[
{
"id": 61057,
"name" : "Smith",
"class": null
},
{
"id": 61058,
"name" : "Jason",
"class": null
},
{
"id": 61060,
"name" : "Mark",
"class": {
"id": 3,
"department_id": 5
}
},
{
"id": 61061,
"name" : "Tony",
"class": {
"id": 3,
"department_id": 5
}
}
]
第二个版本是:
[
{
"id": 3,
"department_id" : 5,
"students": [
{
"id": 61060,
"name" : "Mark"
},
{
"id": 61061,
"name" : "Tony"
}
]
}
]
[
{
"id": 61057,
"name" : "Smith",
"class": null
},
{
"id": 61058,
"name" : "Jason",
"class": null
},
{
"id": 61060,
"name" : "Mark",
"class": {
"id": 3,
"department_id": 5
}
},
{
"id": 61061,
"name" : "Tony",
"class": {
"id": 3,
"department_id": 5
}
}
]
有人能解释一下这两个版本的结果有什么不同吗?
为什么在第二个版本中针对类密钥使用null?
laravel eloquent实际是如何处理这些查询的
classRepo是“类”类的对象
class Classes extends Model{
public function students()
{
return $this->hasMany('App\repoModels\Student','class_id','id');
}
}
studentRepo是“学生”类的对象
class Student extends Model{
public function class()
{
return $this->hasOne('App\repoModels\Classes', 'id', 'class_id');
}
}
这看起来是左连接,而不是内部连接 如果您从学生开始,eloquent将显示所有学生及其对应的类,即使该类为空 如果你从课堂开始,雄辩将显示所有课堂及其对应的学生(忽略没有课堂的学生)
如果希望两个查询返回相同的结果,您可能必须特别要求Elount执行内部联接。这看起来是左联接,而不是内部联接 如果您从学生开始,eloquent将显示所有学生及其对应的类,即使该类为空 如果你从课堂开始,雄辩将显示所有课堂及其对应的学生(忽略没有课堂的学生)
如果希望两个查询返回相同的结果,您可能必须特别要求Elount执行内部联接。您的查询没有正确约束 你雄辩的质询
return $studentRepo
->with(['class' => function($query){
$query->select(['id', 'department_id'])
->where(['department_id' => 5]);
}])
->get();
是说“返回所有学生及其对应的班级,但仅当班级在第五系时才给我上课”
你想让它说的是“返回所有学生及其对应的班级,但仅当他们在第五系的班级时才给我学生”
这里的解决方案是:
return $studentRepo
->with(['class' => function($query){
$query->select(['id', 'department_id'])
->where(['department_id' => 5]);
}])->whereHas('class', function($query) {
$query->where('department_id', 5);
})->get();
请参阅:在“查询关系存在性”下,您的查询未正确约束 你雄辩的质询
return $studentRepo
->with(['class' => function($query){
$query->select(['id', 'department_id'])
->where(['department_id' => 5]);
}])
->get();
是说“返回所有学生及其对应的班级,但仅当班级在第五系时才给我上课”
你想让它说的是“返回所有学生及其对应的班级,但仅当他们在第五系的班级时才给我学生”
这里的解决方案是:
return $studentRepo
->with(['class' => function($query){
$query->select(['id', 'department_id'])
->where(['department_id' => 5]);
}])->whereHas('class', function($query) {
$query->where('department_id', 5);
})->get();
请看:在“查询关系存在性”下,您好,我猜这两个带有“null”的结果没有关系,您是否希望它们不会出现在查询中?是的,我希望它们不会出现。您好,我猜这两个带有“null”的结果没有关系,你希望它们不会出现在查询中吗?是的,我希望它们不会出现。是的,我也这么想,但是使用with不构成内部联接吗?是的,我也这么想,但是使用with不构成内部联接吗?