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
表。 Departments
、Position
、Employees
表。
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
的外键
用户可以有多个Departments
。 Departments
可以有多个Positions
,Positions
可以有多个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,MySQL,迁移中正确的外键设置(一对多,多对多)
试图获取每个连接记录都处于非活动状态的外键记录(Laravel 雄辩查询)