Laravel 5.3 查询从通过外键连接的 4 个表中获取结果

Posted

技术标签:

【中文标题】Laravel 5.3 查询从通过外键连接的 4 个表中获取结果【英文标题】:Laravel 5.3 query to get results from 4 tables which has connections via Foreign Key 【发布时间】:2017-05-10 12:59:33 【问题描述】:

我正在使用 Laravel 5.3。我有 4 张桌子。 默认Users 表。 DepartmentsPositionEmployees 表。

Users 表有ID | Email | Password

Departments 表有ID | Department | User_Id - 这里User_Id 是来自Users 表的ID 的外键

Positions 表有ID | Position | Department_Id - 这里Department_Id 是外键来自Departments 表的ID

Employees 表有ID | Employee | Position_Id - 这里Position_Id 是来自Positions 表的ID 的外键

用户可以有多个DepartmentsDepartments可以有多个PositionsPositions可以有多个Employees。那么,如果用户不同,我如何从该用户创建的所有 4 个表中检索所有数据?

【问题讨论】:

【参考方案1】:

你可以使用nested eager loading:

$departments = Department::where('user_id', $id)
    ->with('positions', 'positions.employees')
    ->get();

另一种方法是构建简单查询:

$departments = Department::where('user_id', $id)->get();
$positions = Position::whereIn('department_id', $departments->pluck('id'));
$employees = Employee::whereIn('position_id', $positions->pluck('id'));

【讨论】:

你的答案和这个有什么区别-***.com/a/29166530/3866364我试过这样,但无法正确创建关系。 差异是什么意思?如果您的关系不起作用,请发布另一个问题并添加您的关系代码和外键的确切名称(区分大小写)。 很抱歉给您带来了困惑。我的意思是,你的答案只有查询。但在其他问题的答案中,我分享了上面的评论,使用了模型(例如 OneToMany、ManyToOne 等)。那么,使用 urs 之类的查询或使用 Modal 关系有什么好处? 感谢您的改写,现在我明白了。没有区别,因为在我的示例(第一个解决方案)中,我使用了关系 positions()employees()。我们将需要设置这些以使第一个解决方案代码工作。只需在适当的模型中添加这些关系(我相信都是hasMany())。 在这种情况下使用关系要方便得多。但是如果你不想使用关系,你可以使用where() 来处理集合。举个例子:像往常一样迭代部门@foreach ($departments as $department),在那个循环中迭代像@foreach ($positions->where('department_id', $department->id) as $position)这样的职位。

以上是关于Laravel 5.3 查询从通过外键连接的 4 个表中获取结果的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.3 迁移:1215 无法添加外键约束

Laravel 5.3,MySQL,迁移中正确的外键设置(一对多,多对多)

试图获取每个连接记录都处于非活动状态的外键记录(Laravel 雄辩查询)

从 Laravel 5.3 升级到 Laravel 5.4 并且空字段转换为 NULL

laravel 5.3 关系模型使用非默认键

将相同的外键添加到 4 行 Laravel