Php Laravel雄辩库-查询是否给出意外结果?

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

我正在使用laravel雄辩的查询来获得属于某个系的所有学生的结果。 这种关系是这样的: 每个系都有课。 每个班都有学生

如果我们在MySQL上写这篇文章,我们可以有两个版本: 假设我们想要第五系的学生

一,

从类中选择*
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不构成内部联接吗?