php - 关于Laravel中的关系模型使用中的问题

查看:82
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆