eloquent 一对一关联后怎么根据副表中的字段来排序?

两个表
goods:商品信息表,存放的上商品的基本信息字段

CREATE TABLE `goods` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品自增ID',
  `goods_name` varchar(255) NOT NULL COMMENT '商品名称',
  `brand_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '品牌id',
  PRIMARY KEY (`id`),
  KEY `goods_brand_id_index` (`brand_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表';

goods_data:商品信息副表,比如存放商品的“点击数”字段

CREATE TABLE `goods_data` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `goods_id` int(10) unsigned NOT NULL COMMENT '商品ID',
  `click_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '商品点击数',
  PRIMARY KEY (`id`),
  UNIQUE KEY `goods_data_goods_id_unique` (`goods_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品相关数据表';

问题描述:
这两个表用 eloquent 定义一对一关联 。我现在想获得某个品牌的商品列表,并且根据商品的点击数来对商品进行排序。这种用 eloquent 怎么处理,不想用 leftJoin 来处理?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 8

@小强 亲爱的,贴代码的时候需要注意格式哦:

```php 
这里是代码
```

已经帮忙你的内容修改好了. :smile:

3年前 评论

既然是一对一,那么你查 goods_datas 表和 goods 表同样的效果。记得用上预加载。

GoodsData::with('good')->orderBy('click_count', 'desc')->paginate();
3年前 评论

@zhuzhichao 想获得某个品牌的商品列表,并且根据商品的点击数来对商品进行排序

3年前 评论
GoodsData::with('good')->whereHas('good', function($q) use ($brandId) {
    $q->where('brand_id', $brandId)
})->orderBy('click_count', 'desc')->paginate();
3年前 评论

@zhuzhichao 嗯嗯,其实我纠结的是想让返回的数据直接是goods的数据,这样在切换各种排序的时候不要老是调整返回数据。

3年前 评论

那么考虑通过查询把合适的 good_id 拿出来, 然后通过 Good 用 whereIn 进行查询,这样和用上with一样都是只执行两次 SQL 语句。

$goodIds = GoodsData::whereHas('good', function($q) use ($brandId) {
    $q->where('brand_id', $brandId)
})->orderBy('click_count', 'desc')->skip(10)->take(15)->pluck('id');

$goods = Good::whereIn('id', $goodIds)->get();
3年前 评论

@zhuzhichao 这段代码,没有起到效果吧,第一个 SQL 查询出来的 good_id 虽然是排序出来的,但是第二个 SQL 并没有看出来排序啊,因为 whereIn 后面的数组,不在乎元素ID的顺序吧,也不知道我说的对不对。。。

2年前 评论

@kylesean 你说的对,这点确实是我忽略了。这里可以再追加一个 ORDER BY FIELD (id, 23, 21, 45, 49) 进行排序。

2年前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!