php - 关于Laravel中的关系模型使用中的问题
本文介绍了php - 关于Laravel中的关系模型使用中的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
现有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
可以加筛选的:
GoodModel::with(['hasOneCate' => function($query) {
$query->select('id', 'name');
}]);
第三个问题是改变关联结果的名字,例如把has_one_cate
改成cateInfo
,没找到直接的方法。一个思路是自己重现拼装数据,或者进一步封装成View Model
。
这篇关于php - 关于Laravel中的关系模型使用中的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文