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());
}
}