您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
thinkphp5学习笔记-关联-多对多
发布时间:2018-06-14 21:43:57编辑:雪饮阅读()
多对多关联模型:
假设一个用户可以有多个妻子,一个妻子也可以有多个用户.
像这种关系叫做多对多关系.
多对多关联模型的搭建:
以用户和妻子为例.
需要三张表:
用户表、枢纽表、妻子表
用户表字段结构:
主键id、username、psw
枢纽表字段结构:
user_id、wife_id
妻子表字段结构:
主键id、username、age
配置用户模型和妻子模型进行多对多关联:
用户模型:
<?php
namespace app\index\model;
use think\Model;
class sUser extends Model
{
//定义关联方法
public function wife(){
/*
假若一个用户可以有多个妻子,一个妻子有多个用户
那么给用户表配置多对多关联belongsToMany
*/
/*
参数说明分别是:
对方模型表名
枢纽表名
枢纽表中对方模型的关联字段(这里是妻子id)
枢纽表中当前模型的关联字段(这里是用户id)
*/
return $this->belongsToMany('wife','userwife','wife_id','user_id');
}
}
?>
妻子模型:
<?php
namespace app\index\model;
use think\Model;
class Wife extends Model{
public function user(){
return $this->belongsToMany('s_user','userwife','wife_id','user_id');
}
}
?>
在控制器中使用多对多关联模型:
多对多关联新增:
这里是先查询到用户名为“雪饮”的用户,然后给“雪饮”用户新增一个妻子。
新增后关联表就会新增一个“雪饮”与刚新增的妻子的关联记录,同时妻子表中也会新增一个妻子。
$sUser=sUser::getByUsername('雪饮');
$sUser->wife()->save(['username'=>'杜敏捷','age'=>28]);
echo "用户{$sUser->username}新增一个妻子成功";
多对多关联新增(批量)
$sUser=sUser::get(1135);
$sUser->wife()->saveAll([
['username'=>'杜敏捷','age'=>28],
['username'=>'柠檬不萌','age'=>28]
]);
echo "用户{$sUser->username}批量新增妻子成功";
多对多关联-attach新增:
当一个用户和一个妻子都存在时候,只是用户和妻子并没有在枢纽表中建立关联关系,此时就可以用attach了,下面实例是以用户为主导在枢纽表中增加妻子的。
//实例化一个用户
$sUser=sUser::get(1135);
//实例化一个妻子
$wife=wife::getByUsername('杜敏捷');
//将这对夫妻记录到枢纽表
$sUser->wife()->attach($wife);
echo "用户{$sUser->username}和妻子{$wife->username}已记录到枢纽表中";
多对多关联-attach新增-直接通过对方模型主键新增
上面的attach新增是通过实例化了对方模型的实例然后新增的,而接下来的这种实例是不需要实例化对方模型实例,而是直接通过对方模型主键即可。
//实例化一个用户
$sUser=sUser::get(1135);
//通过妻子id来绑定
$sUser->wife()->attach(13);
echo "用户{$sUser->username}和13号妻子已绑定关联记录到枢纽表中";
多对多关联-detach删除:
用户休掉了自己的一个妻子,解除了他们在枢纽表中的关系。
//实例化一个用户
$sUser=sUser::getByUsername('aaa');
//实例化一个妻子
$wife=wife::getByUsername('ccc');
$sUser->wife()->detach($wife);
echo "用户{$sUser->username}已经休了其妻子{$wife->username}";
多对多关联-detach删除-连同对方也从对方的模型中剔除
//实例化一个用户
$sUser=sUser::getByUsername('aaa');
//实例化一个妻子
$wife=wife::getByUsername('ccc');
$sUser->wife()->detach($wife,true);
echo "用户{$sUser->username}已经休了其妻子{$wife->username},且让{$wife->username}从{$wife->username}所属单位中被剔除";
多对多关联-查询:
$sUser=sUser::get(1135);
p($sUser->wife[0]->username);
p($sUser->wife[1]->username);
多对多关联-查询-一次性查询
该实例中无论是否使用p函数将结果向出打印,都会在第一条语句的时候进行联查。
而上面的“多对多关联-查询”则只有调用wife的时候才会进行联查。
该实例和上面的实例在查询上也有共同点:就是无论如何都会调用本模型自身的sql查询
$sUser=sUser::get(1135,'wife');
p($sUser->wife[0]->username);
p($sUser->wife[1]->username);
关键字词:thinkphp5,多对多