现有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获取出了一条信息, 但是大概是这样的:
谢邀。
第一个问题是建模。
你要从领域逻辑的角度去建立模型,而不是看你需要的查询结果。
逻辑上是栏目有多个(
hasMany
)商品,商品属于(belongsTo
)一个栏目。虽然在你这个特定用例下,用一对一没问题,其他情况就不行了。
第二个问题是筛选关联的结果字段,
with
可以加筛选的:第三个问题是改变关联结果的名字,例如把
has_one_cate
改成cateInfo
,没找到直接的方法。一个思路是自己重现拼装数据,或者进一步封装成View Model
。