与同一张桌子的关系(多对多?)-Laravel

时间:2019-05-29 19:27:42

标签: php laravel eloquent many-to-many relationship

在我的数据库中,我必须保存人和与第一个人有关系的人的数据。例如:父亲,母亲,儿子,女儿等

然后是数据库的设计,我是在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);
    }

要成功完成这段关系,我应该添加些什么?

2 个答案:

答案 0 :(得分:1)

您需要定义表,主键和外键,因为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

答案 1 :(得分:0)

Laravel 为两个不同表的 manyToMany 关系提供了一个很好的约定,但是当我们需要在同一个表中使用 manyToMany 关系时,这个约定不起作用。 解决步骤:

  1. 创建一个数据透视表并给它一个有意义的名字,比如亲戚(person_person 不合适),然后在这个表中创建两个列 persion_id 和 relative_persion_id。
  2. 使用 classname,将其他三个参数作为表名(亲戚)、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'); }