thinkphp5 belongsToMany多对多关联

比起一对一,一对多,多对多关联要复杂的多

belongsToMany方法的参数如下:


belongsToMany('关联模型名','中间表名','外键名','当前模型关联键名',['模型别名定义']);
$this->belongsToMany('area','ar_reg','area_id','arps_id');中,area是要关联的模型名,ar_reg是中间表名(也就是关联表名),area_idarps_id关联表中的两个字段area_id字段对应着area表,arps_id字段对应着ar_ps表。
关联表中的两个字段名一定要与相应的表名对应,否则会数据写入时倒置。

另:后面的字段id名称可以为空,也就是上面的可以写成
$this->belongsToMany('area','ar_reg');
这时候程序会用模型名称+_id来自动找关联表中对应的,如ar_ps表则会找arps+_id这个,也就是arps_id

例子中用到的表

dede_area   地区表
dede_ar_ps   配送区域表
dede_ar_reg  关联表 该表不用创建模型

例子中,我们将在配送区域表中,将地区表中支持配送的区域名按自定义名称放入到里面

各表中目前的字段如下
dede_area表
thinkphp5 belongsToMany多对多关联

dede_ar_ps表
thinkphp5 belongsToMany多对多关联thinkphp5 belongsToMany多对多关联
dede_ar_reg表
thinkphp5 belongsToMany多对多关联

建立两个模型文件

Area.phpArPs.php,关联表不需要建立,因为这两个文件中已经调用了关联表
Area.php内容
<?php
namespace app\admin\model;
use think\Model;
class Area extends Model
{
	public function arps()
	{
		return $this->belongsToMany('ar_ps','ar_reg','arps_id','area_id');
	}

}

ArPs.php内容
<?php
namespace app\admin\model;
use think\Model;
class ArPs extends Model
{
	
	public function area()
		{
			return $this->belongsToMany('area','ar_reg','area_id','arps_id');
		}
}

实现一个小小的关联

public function ar()
	{
		
		$reg = Area::getByName('北京市');
		$reg->arps()->save(['ar_name'=>'中国首都']);		
		
	}
运行后dede_ar_psdede_ar_reg表数据如下

thinkphp5 belongsToMany多对多关联
thinkphp5 belongsToMany多对多关联

可以看到区域表北京市id一线城市id已经被插入到里面。

批量新增

$reg = Area::getByName('重庆市');
		$reg->arps()->saveAll([
			['ar_name'=>'火笼'],
			['ar_name'=>'全国一线城市']
		]);

对已有项目进行关联

 

V5.0.6+版本开始,attach方法的返回值是一个Pivot对象实例,如果是附加多个关联数据,则返回Pivot对象实例的数组。


下面语句关系梳理:
第一条语句:先从area表中取出id1内容
第二条语句:接着从ar_ps表中取出name火笼的这条
第三条语句:用attach两者id关联在同一列
$reg = Area::get(1);
		$arps = ArPs::getByArName('火笼');
		$reg->ArPs()->attach($arps);
原表中,火笼在上面已经添加过,我们将area表1的北京再添加到这个项止中,现将添加的表写入

thinkphp5 belongsToMany多对多关联
 
thinkphp5 belongsToMany多对多关联

可以看到area_id14的都对应着arps_id8,而8就是火笼

删除已有关联


下面语句关系梳理:
第一条语句:先从area表中取出name北京市的内容
第二条语句:接着从ar_ps表中取出id8
第三条语句:发现关联表中两者的id都存在同一列,用detech将其删除
$reg = Area::getByName('北京市');
		$arps = Arps::get('8');
		$reg->Arps()->detach($arps);

同时删除关联表与配送区域表中的内容

上面的删除已有关联,只是将关联表中的删除,配送区域表中的并没有删除,但有时候我们想要将两者都删除,那就需要给detachtrue参数
$reg = Area::getByName('重庆市');
		$arps = Arps::get('8');
		$reg->Arps()->detach($arps,true);

运行上面语句前两张表的内容
thinkphp5 belongsToMany多对多关联
thinkphp5 belongsToMany多对多关联

运行后
thinkphp5 belongsToMany多对多关联

thinkphp5 belongsToMany多对多关联

查询同一个城市有哪些关联名

地区表中的北京,在配送表中有一线城市和首都两个关联名,我们进行相关查询
		$reg = Area::get(1);
		foreach($reg->arps as $data)
		{
			echo $data['ar_name']."<br>";
		}
输出为
一线城市
首都

评论

大侠名号:   验证暗号: 点击我更换图片

修远兮

在这里记录每一点自己需要的知识

添加创始人微信,一起交流心得

推荐文章RECOMMEND