kavo

thinkphp5的模型关系示例,自己测试的代码

中间表不需要建模型,只要存在即可.

一下是测试代码,表都建好了,按照:https://www.kancloud.cn/thinkphp/master-database-and-model/265559

我的控制器开启了后缀支持,所以不需担心和模型名冲突

<?php
namespace app\demo\controller;

use app\demo\model\Blog;
use app\demo\model\Comment;
use think\Controller;
use app\demo\Model\User;
use app\demo\Model\City;
use app\demo\Model\Role;

class IndexController extends BaseController
{
    //学习模型关系
    public function city1()
    {
        /*
         City模型中一对多----针对user表
         city在user表里的外键为city_id
         用法:hasMany('关联模型','外键','主键');
         除了关联模型外,其它参数都是可选。
         关联模型(必须):模型名或者模型类名
         外键:关联模型外键,默认的外键名规则是当前模型名+_id
         主键:当前模型主键,一般会自动获取也可以指定传入
         return $this->hasMany('User');
         参数全部写上的用法
         return $this->hasMany('User','city_id','id');
         */
        $city = City::get(1);
        foreach ($city->users as $v)
        {
            //查询到id为1的城市,然后在一对多关系,查询到该城市下面的所有用户,
            dump($v->toArray());
        }

    }


    public function city2()
    {
        /*远程一对多
         *获取某个城市下面的所有博客---因为city和blog两个表并没有直接关系,所以为远程一对多关系
         * 用法:hasManyThrough('关联模型','中间模型','外键','中间表关联键','主键');
         *  关联模型(必须):模型名或者模型类名
            中间模型(必须):模型名或者模型类名
            外键:默认的外键名规则是当前模型名+_id
            中间表关联键:默认的中间表关联键名的规则是中间模型名+_id
            主键:当前模型主键,一般会自动获取也可以指定传入
         return $this->hasManyThrough('Blog','User');

         //参数全部写上,符合以下的两个必须的参数外都可以不写
         return $this->hasManyThrough('Blog','User','city_id','user_id','id');
         */
        $city = City::get(1);
        //dump($city->blogs);
        foreach ($city->blogs as $val)
        {
            dump($val->toArray());
        }
    }

    public function user1()
    {
        /*多对多
         * 用法:belongsToMany('关联模型','中间表','外键','关联键');
        关联模型(必须):模型名或者模型类名
        中间表:默认规则是当前模型名+_+关联模型名 (注意,在V5.0.8版本之前需要添加表前缀)
        外键:中间表的当前模型外键,默认的外键名规则是关联模型名+_id
        关联键:中间表的当前模型关联键名,默认规则是当前模型名+_id
        return $this->belongsToMany('Role','Auth');
        完整的写法return $this->belongsToMany('Role','Auth','role_id','user_id');
         */
//        获取用户所属的角色信息
        $user = User::get(1);
        foreach ($user->roles as $list)
        {
            dump($list->toArray());
            /*
             * array(3) {
              ["id"] => int(2)
              ["name"] => string(9) "编辑员"
              ["pivot"] => array(3) {
                ["id"] => int(1)
                ["user_id"] => int(1)
                ["role_id"] => int(2)
              }
            }
             */
        }
    }

    public function user2()
    {
        /*多态一对多 MORPH MANY
         * 用法:morphMany('关联模型','多态字段','多态类型');

        关联模型(必须):模型名或者模型类名
        多态字段:多态字段信息定义包含两种方式,字符串的话表示多态字段的前缀,数组则表示实际的多态字段
        多态类型:默认是当前模型名

        数据表的多态字段一般包含两个字段:多态类型和多态主键。

        如果多态字段使用字符串例如morph,那么多态类型和多态主键字段分别对应morph_type 和 morph_id,如果用数组方式定义的话,就改为['morph_type','morph_id']即可。

        return $this->morphMany('Comment','commentable');
        完整写法:return $this->morphMany('Comment','commentable');
         */
        //获取该用户下面的所有评论,虽然可以在comment表中在加一个对应的user_id,然后一对多取出,但是随着多态关联的增加,显然结构很不合理
        //举例场景,web的图片就可以统一建立一个img表,然后各种图片均可以在此
        $user = User::get(2);
        foreach ($user->comments as $list)
        {

            dump($list->toArray());
        }
    }

    public function role()
    {
        /*获取角色下面的用户信息,多对多关联和相对关联都是belongsToMany
         *return $this->belongsToMany('User','Auth');
         */
        $role = Role::get(2);
        foreach ($role->users as $list)
        {
            //数据同一样包含一个pivot模型,包含中间表的数据
            dump($list->toArray());
        }

    }

    public function blog1()
    {
        /*多对一关系belongsTo
         *用法:belongsTo('关联模型','外键','关联表主键');
            除了关联模型外,其它参数都是可选。
            关联模型(必须):模型名或者模型类名
            外键:当前模型外键,默认的外键名规则是关联模型名+_id
            关联主键:关联模型主键,一般会自动获取也可以指定传入
        return $this->belongsTo('User');
        完整写法:return $this->belongsTo('User','user_id','id');
         */
        $blog = Blog::get(1);
//        dump($blog->users->toArray());
        /*hasOne用法 return $this->hasOne('Content');
        完整的的写法: return $this->hasOne('Content','blog_id','id');
         *
         */
        dump($blog->contents->toArray());
    }

    public function blog2()
    {
        /*
         * 用法:morphMany('关联模型','多态字段','多态类型');
        关联模型(必须):模型名或者模型类名
        多态字段:多态字段信息定义包含两种方式,字符串的话表示多态字段的前缀,数组则表示实际的多态字段
        //多态字段在comment表中为commentable_id 为关联模型的id(比如user的id或者blog的id),commentable_type为关联模型名
        ,比如为user或者blog,你可以自定义堕胎字段,比如morph,那么多态字段应该为morph_id和morph_type
        多态类型:默认是当前模型名
        return $this->morphMany('Comment','commentable');
        完整用法:return $this->morphMany('Comment','commentable','blog');
         */
        $blog = Blog::get(2);
        dump($blog->comments);
    }

    public function comment()
    {
        /*
         * 用法:morphTo('多态字段','多态类型别名(数组)');
            多态字段:定义和morphMany一致
            多态类型别名:用于设置特殊的多态类型(比如用数字标识的多态类型)
        return $this->morphTo();
        完整写法:
         */
        $comment = Comment::get(1);
        dump($comment->commentable->toArray());

    }

}




posted on 2017-12-01 10:08  下雨天唱情歌  阅读(3)  评论(0编辑  收藏  举报  来源

导航