与同一张表的关系(多对多?) - Laravel
Posted
技术标签:
【中文标题】与同一张表的关系(多对多?) - Laravel【英文标题】:Relationship with the same table (Many to Many?) - Laravel 【发布时间】:2019-10-15 11:07:03 【问题描述】:在我的数据库中,我必须保存人和第一个有关系的人的数据。例如:父亲、母亲、儿子、女儿等
然后数据库的设计,我是在following way做的,是一个多对多的关系,因为,一个人有很多人与之相关。
但我不确定是否可以..
class Person extends Model
protected $fillable = [
'name',
'surname',
'profile_picture'
.....
];
public function relationships()
return $this -> belongsToMany(Person::class);
当我创建关系时,我会创建一个名为 person_person 的第三个迁移表来保存 ID 和描述(父亲、母亲、儿子、女儿)
这样描述关系可以吗?
public function relationships()
return $this -> belongsToMany(Person::class);
我应该添加什么来完成这种成功的关系?
【问题讨论】:
我会反对这里的约定。 person_person 是家庭成员的错误表名。 Eloquent 允许您指定自己的表名。 德文!谢谢你的建议。我会改名字,但是关系呢?是否正确添加与 belongsToMany() 的方法关系? 【参考方案1】:Laravel 为两个不同的表的manyToMany
关系提供了一个很好的约定,但是当我们在同一个表中需要manyToMany
关系时,这个约定不起作用。
解决步骤:
-
创建一个数据透视表并给它起一个有意义的名称,例如 relatives(person_person 不适合),并在此表 persion_id 和 relative_persion_id 中创建两个列。
使用类名,将其他三个参数作为表名(亲戚)、persion_id 和 relative_persion_id 传递。
这个链接有完美的解决方案https://laracasts.com/series/laravel-6-from-scratch/episodes/58
public function relationships() return $this->belongsToMany(Person::class,'relatives','persion_id','relative_persion_id');
【讨论】:
【参考方案2】:您需要定义表、主键和外键,因为 Laravel 可能无法确定这一点(它会尝试,但可能不会成功)。比如:
public function relationships()
return $this->belongsToMany(Person::class, "person_person", "id_person", "id_person_related")
->withPivot(["parentesco"]);
或类似的。表名有点别扭,考虑一下其他的,比如'relationships'
或者传达更多含义的东西。
有关如何为belongsToMany()
定义附加参数的详细信息,请参阅https://laravel.com/docs/5.8/eloquent-relationships#many-to-many
【讨论】:
我有 2 张桌子......你可以在下面看到 LINK 是的,我知道,person_person
是people
和people
(本身)之间的数据透视表。这反映在belongsToMany()
中。 $this
(Person
) 通过person_person
属于许多其他Person
类。
好的..那么,这种关系会很好定义吗?
将以上信息添加到belongsToMany()
时,是的;应该没问题。目前,它不起作用;你会得到 SQL 错误,因为 Laravel 试图根据类和函数名来猜测要使用的值,而你定义的值与你的架构不匹配。
太棒了!这真的很有用..我是 laravel 的新手,我不知道“withPivot”方法以上是关于与同一张表的关系(多对多?) - Laravel的主要内容,如果未能解决你的问题,请参考以下文章