与同一张表的关系(多对多?) - 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_personpeoplepeople(本身)之间的数据透视表。这反映在belongsToMany() 中。 $this (Person) 通过person_person 属于许多其他Person 类。 好的..那么,这种关系会很好定义吗? 将以上信息添加到belongsToMany()时,是的;应该没问题。目前,它不起作用;你会得到 SQL 错误,因为 Laravel 试图根据类和函数名来猜测要使用的值,而你定义的值与你的架构不匹配。 太棒了!这真的很有用..我是 laravel 的新手,我不知道“withPivot”方法

以上是关于与同一张表的关系(多对多?) - Laravel的主要内容,如果未能解决你的问题,请参考以下文章

如何通过多对多关系获取与同一张表相关的行 - Laravel

Laravel 中多对多关系中连接表的命名约定

与关联对象在同一张表上的多对多关系

与 Laravel 的友谊系统:多对多关系

Laravel一张表连接到另外两个由多对多的关系

Laravel Datatable 与多个表的多对多关系