如何更优雅的实现 ORM 多对多的查询?
有如下表结构:
Users 用户
- id
- name
Goods 商品
- id
- name
Orders 订单
- id
- user_id
- goods_id
- money
当 传入一个 ID 为 1 的 Goods 商品模型,Goods 需要查询关联的 Orders 是否存在 user_id 为 1 的订单记录,怎样可以更优雅?
// 控制器代码如下
// 商品模型
$goods = Goods:find(1);
// 用户模型 已登陆过的
$user = Auth::user();
// 查询商品关联订单模型,并且是 user_id 的记录
// ...
// 并不想使用如下代码
$goods->order()->where('user_id', $user->id)->get();
// or
$user->order()->where('goods_id', $goods->id)->get();
期望:
- 不希望使用 where() 来查询
- 更不想在控制器中暴露有 id user_id 等字段的显示
- 仅仅只是 ORM 模型关联上的操作
感谢各位的积极回复,这个问题一直在困扰我,因为是受一个关联插入的影响,我感觉下面的代码插入关联很优雅
// 商品模型
$goods = Goods::find(1);
// 用户模型 已登陆过的
$user = Auth::user();
// 订单模型
$order = new Order($data);
// 订单关联商品模型
$order->goods()>associate($goods);
// 订单关联用户,并插入
$user->order()->save($order);
// 结果: ['id'=>1, 'user_id'=>1, 'goods_id'=>1]
感觉这种不暴露 user_id goods_id 的字段去插入关联数据的方式很不错,但用关联查询的时候就很头疼。。
查看这个:判断记录是否存在;建议善用文档搜索功能
@ouyuan 可能您没有明白我的问题吧 :sweat_smile:
我觉得你这样写也没有什么问题。
本来就是这么用的。。。然后你并不想这么写。。。
@Epona 是么,没有更优雅的方案了么 :joy:
@青风百里 哈哈,就是想更优雅一点- -
看错了不好意思
一对多不用where没办法,可能你写个scope比较好,里面写死字段查询
随手一写,不知道是不是想要这种格式?
@ouyuan 感谢回复,总以为会有更好的关联方式
@linxb 感谢回复,这样写感觉更复杂吧 :joy:
可以用Scope封装一下