本文目的是查看 Eloquent 在执行模型关联时运行的 SQL 语句
环境
- PHP 7
- Laravel 5.1
简介
数据表之间经常会互相进行关联。例如,一篇博客文章可能会有多条评论,或是一张订单可能对应一个下单客户。Eloquent 让管理和处理这些关联变得很容易,同时也支持多种类型的关联:
- 一对一
- 一对多
- 多对多
- 远层一对多
- 多态关联
- 多态多对多关联
接下来,我会根据公司项目的数据库结构,进行举例说明
准备
新增控制器
1 | php artisan make:controller EloquentController |
新增路由
1 | Route::get('/', function () { |
一对一
场景是如每一名加盟商都对应着一份加盟商配置
新增模型
1 | php artisan make:model Models/League |
在 League
模型添加代码如下
1 | // League.php 一名加盟商有一份配置 |
在 LeagueConfig
模型添加代码如下
1 | // LeagueConfig.php 一份配置对应一名加盟商 |
控制器新增代码如下
1 | public function oneToOne(Request $request) |
查看 SQL
1 | SELECT |
一对多
场景是仓库一种 SKU 的水果能被多名加盟商进货
新增模型
1 | php artisan make:model Models/Product |
Product
模型中添加代码
1 | public function league() |
控制器新增代码如下:
1 | public function oneToMany(Request $request) |
查看 SQL
1 | SELECT |
多对多
场景是一名用户使用多张不同种类的优惠券,一种优惠券被不同的用户使用
新增模型
1 | php artisan make:model Models/User |
User
模型添加代码如下
1 | public function voucher() |
Voucher
模型添加代码如下
1 | public function user() |
控制器新增代码如下
1 | public function manyToMany(Request $request) |
查看 SQL
1 | # 查询 ID 为 42115 的用户使用过的优惠券 |
远程一对多
新增模型
1 | php artisan make:model Models/Order |
Order
模型新增代码如下
1 | public function order() |
控制器新增代码如下
1 | public function hasManyThrough(Request $request) |
查看 SQL
1 | # 查询 ID 为 20 的加盟商旗下用户的商品订单 |
多态关联
新增模型如下
1 | php artisan make:model Models/Staff |
控制器新增代码如下
1 | public function polymorphicRelations(Request $request) |
查看 SQL
1 | # 查看 ID 为 8 的职员的所有照片 |
多态多对多关联
新增模型如下
1 | php artisan make:model Models/Tag |
控制器新增代码如下
1 | public function manyToManyPolymorphicRelations(Request $request) |
查看 SQL
1 | # 查询 ID 为 8 的文章所使用的标签 |