php - 关于Laravel中的关系模型使用中的问题
阿神
阿神 2017-04-11 09:42:28
[PHP讨论组]

现有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获取出了一条信息, 但是大概是这样的:

阿神
阿神

闭关修行中......

全部回复(2)
迷茫

谢邀。

第一个问题是建模。

你要从领域逻辑的角度去建立模型,而不是看你需要的查询结果。

逻辑上是栏目有多个(hasMany)商品,商品属于(belongsTo)一个栏目。

虽然在你这个特定用例下,用一对一没问题,其他情况就不行了。

第二个问题是筛选关联的结果字段,with可以加筛选的:

GoodModel::with(['hasOneCate' => function($query) {
    $query->select('id', 'name');
}]);

第三个问题是改变关联结果的名字,例如把has_one_cate改成cateInfo,没找到直接的方法。一个思路是自己重现拼装数据,或者进一步封装成View Model

伊谢尔伦

首先设计就错了,这显然不是一对一关系,明显一个分类可以对应多个商品,应该是一对多关系。
在商品模型中,应该使用belongsTo而非hasOne

至于关联条目的名称,Laravel是直接去定义关系的方法名的,也就是说,你直接用

public function cateInfo()
{
    return $this->belongsTo('App\Model\CateModel', 'cate_id');
}

就能使用cate_info这个字段。
如果想要在toArray()输出中使用驼峰字段名,也就是cateInfo,将GoodModel中的public static $snakeAttributes属性定义成false即可。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号