现有2张表, 结构如下:
cate(栏目表):
id int,
name varchar,
...
good(商品表):
id int,
cate int,
name varchar,
...
其中 good 表中的 cate 字段对应于 cate 表中的 id 字段.
现在有一个需求, 获取出所有商品 (分页什么的先不考虑) 以及此商品对应的分类ID 分类名称:
[
[
id => 1,
name => '商品1',
cateInfo => [
id => 2,
name => '分类1'
]
],
[
id => 2,
name => '商品2',
cateInfo => [
id => 2,
name => '分类1'
]
],
...
]
现在想用Laravel框架中的关系模型来实现此功能,
我感觉这种情况下, 应该用的是 一对一 吧. 一个商品对应一个栏目.
于是我在GoodModel中做了如下定义:
public function hasOneCate()
{
return $this->hasOne('App\Model\CateModel', 'id', 'cate');
}
在控制器中写入了如下代码:
GoodModel::find(1)->hasOneCate;
但是, 这个他返回来的只是一条商品的信息, 而且是分类信息.
所以我想到了使用with, 但是我对with并不是很理解, 代码如下
GoodModel::with('hasOneCate')->first()
GoodModel::with('hasOneCate')->get()
# 全部成功, 但是跟期望的有所不同, 如下图
所以现在想请教一下这种问题该如何解决, 以及with是干嘛用的, 虽然上面通过with获取出了一条信息, 但是大概是这样的:

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
谢邀。
第一个问题是建模。
你要从领域逻辑的角度去建立模型,而不是看你需要的查询结果。
逻辑上是栏目有多个(
hasMany)商品,商品属于(belongsTo)一个栏目。虽然在你这个特定用例下,用一对一没问题,其他情况就不行了。
第二个问题是筛选关联的结果字段,
with可以加筛选的:第三个问题是改变关联结果的名字,例如把
has_one_cate改成cateInfo,没找到直接的方法。一个思路是自己重现拼装数据,或者进一步封装成View Model。首先设计就错了,这显然不是
一对一关系,明显一个分类可以对应多个商品,应该是一对多关系。在商品模型中,应该使用
belongsTo而非hasOne。至于关联条目的名称,Laravel是直接去定义关系的方法名的,也就是说,你直接用
就能使用
cate_info这个字段。如果想要在toArray()输出中使用驼峰字段名,也就是
cateInfo,将GoodModel中的public static $snakeAttributes属性定义成false即可。