之前,在文章:https://cloud.tencent.com/developer/article/1538357 已经发过关于Laravel中的多对多关系了。
但回过头来,过了个把月再去看,我自己都忘了怎么写了。
确实看laravel的中文文档,看得糊里糊涂的。还是得在实践中理解啊。
我有一张来源表(referers)来记录href和网页标题title。
还有一张信息表(netDisks)来记录一些东西。
目前需求是信息表里面的多个信息可能同属于来源表中的一条记录。 同样,来源表中的多条信息可能属于信心表中的一条记录。 简言之就是,这是多对多的关系。
新建迁移文件就不说了。
我想说的重点是: 1、来源表和信息表可以没有任何外键约束,意思就是说各建各的,不用考虑外键什么的。 2、这两表没有任何外键关联,如果还要产生关系,那么就要第三张表来帮他们建立联系。
以上两点需要特别理解好
我前面说了,两张表(信息表、来源表)没有任何关系,那么就随便按需求建立就行。
重点是第三张表,第三张表最少需要2个字段:即两张表的外键
注意: 1、你想要有其他字段也行,我们这里讨论最简单的情况。 2、第三张表的命名有要求,主要是Laravel默认情况的关系。看上图:
net_disk_referrer
是我第三张表的名称,原因是前面两张表是(netDisk,referrer) n在r前面,所以是net_disk_referrer
而不是referrer_net_disk
当然,搞不懂默认关系,我们在模型关联的时候指定表明就行。请看下面。
好了,表已经建立完毕 了,该讨论怎么用了。
1、我们已经在来源表(referrers)表建立了一条记录,并且得到了一个id:
$ref = Referrer::create(['href'=>$href,'title'=>$title]);
$id = $ref->id;
2、假设我们在信息表(netDisks)插入了一条记录,得到一个model:
$model = NetDisk::create(['xx'=>$xx]);
那么我们可以使用以下语句建立关系:
说白了,这个建立关系就是在第三张表新增记录
$model->attach([$id]);
所以有几点说明: 1、attach()传入的是id,可以是多个id【数组】。至于能不能传入其他参数,或者有没有其他类似attach作用的方法,我翻遍中文文档和百度,愣是没搞明白。 2、attach要使用,要在模型中定义关联。
如图,如果前面我们 搞不懂第三张表的命名,那么在这里指定即可。也最好指定以下,避免不知道的错误发送。
好了,今天到这里了。