如何更优雅的实现 ORM 多对多的查询?

有如下表结构:

Users 用户
  • id
  • name
Goods 商品
  • id
  • name
Orders 订单
  • id
  • user_id
  • goods_id
  • money

当 传入一个 ID1Goods 商品模型,Goods 需要查询关联的 Orders 是否存在 user_id1 的订单记录,怎样可以更优雅?

// 控制器代码如下
// 商品模型
$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();

期望:

  1. 不希望使用 where() 来查询
  2. 更不想在控制器中暴露有 id user_id 等字段的显示
  3. 仅仅只是 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 的字段去插入关联数据的方式很不错,但用关联查询的时候就很头疼。。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 11

查看这个:判断记录是否存在;建议善用文档搜索功能

4年前 评论

@ouyuan 可能您没有明白我的问题吧 :sweat_smile:

4年前 评论

我觉得你这样写也没有什么问题。

4年前 评论
Epona

本来就是这么用的。。。然后你并不想这么写。。。

4年前 评论

@Epona 是么,没有更优雅的方案了么 :joy:

4年前 评论

@青风百里 哈哈,就是想更优雅一点- -

4年前 评论

看错了不好意思
一对多不用where没办法,可能你写个scope比较好,里面写死字段查询

4年前 评论

随手一写,不知道是不是想要这种格式?

Goods::wherehas('orders',function($query) use ($userId){
    $query->where('user_id', $userId);
})->where('id',1)->get();
4年前 评论

@ouyuan 感谢回复,总以为会有更好的关联方式

4年前 评论

@linxb 感谢回复,这样写感觉更复杂吧 :joy:

4年前 评论

可以用Scope封装一下

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!