thinkphp5.0 模型关联

banner相关数据表字段一览

表banner_item
id
img_id 外键,关联image表
key_word 执行关键字,根据不同的type含义不同
type 跳转类型,可能导向商品,可能导向专题,可能导向其他。0,无导向; 1:导向商品;2:导向专题
delete_time
banner_id 外键,关联banner表
update_time

表banner
id
name Banner名称,通常作为标识
description Banner描述
delete_time
update_time

表image
id
url 图片路径
from 1 来自本地,2 来自公网
delete_time
update_time

Banner相关表分析

banner指banner位,banner_item是具体的banner项
一个banner位有多个banner_item,一个banner_item是能属于一个banner,所以是一对多的关系
banner_item与image是一对一关系

使用命令新建BannerItem模型

php think make:model api/BannerItem

查看生成的文件
applicationapimodelBannerItem.php

<?php

namespace appapimodel;

use thinkModel;

class BannerItem extends Model
{
    
}

Banner模型关联BannerItem模型

applicationapimodelBanner.php

<?php

namespace appapimodel;

class Banner extends Model
{
    public function items()
    {      
        //一对多关系使用
        //参数:1.关联模型名 2.关联外键 3.关联模型主键
        return $this->hasMany('BannerItem', 'banner_id', 'id');
    }
}

使用
applicationapicontrollerv1Banner.php

<?php

namespace appapicontrollerv1;


use appapivalidateIDMustBePositiveInt;
use appapimodelBanner as BannerModel;

/**
 * Banner资源
 */ 
class Banner
{
    public function getBanner($id)
    {
        $validate = new IDMustBePositiveInt();
        $validate->goCheck();
        $banner = BannerModel::with('items')->find($id);
        if (!$banner) {
            throw new BannerMissException();
        }
        return $banner;
    }
}

查看返回结果

使用命令新建Image模型

php think make:model api/Image
<?php

namespace appapimodel;

use thinkModel;

class Image extends Model
{

}

关联到Image模型

applicationapimodelBannerItem.php

<?php

namespace appapimodel;

use thinkModel;

class BannerItem extends Model
{

    public function img()
    {
        //一对一关系使用
        //参数:1.关联模型名 2.关联外键 3.关联模型主键
        return $this->belongsTo('Image', 'img_id', 'id');
    }
}

使用
applicationapicontrollerv1Banner.php

class Banner
{
    public function getBanner($id)
    {
        $validate = new IDMustBePositiveInt();
        $validate->goCheck();
        //嵌套关联查询
        $banner = BannerModel::with(['items', 'items.img'])->find($id);
        return $banner;
    }
}

返回的数据

从规范性来看,把查询的代码封装下更好

applicationapimodelBanner.php

class Banner extends Model
{
    public function items()
    {
        return $this->hasMany('BannerItem', 'banner_id', 'id');
    }
    public static function getBannerById($id)
    {
        $banner = self::with(['items','items.img'])
            ->find($id);

        return $banner;
    }
}

applicationapicontrollerv1Banner.php

class Banner
{
    public function getBanner($id)
    {
        $validate = new IDMustBePositiveInt();
        $validate->goCheck();
        $banner = BannerModel::getBannerById($id);
        if (!$banner) {
            throw new BannerMissException();
        }
        return $banner;
    }
}
原文地址:https://www.cnblogs.com/Qyhg/p/14756208.html