【问题标题】:Relationship with the same table (Many to Many?) - Laravel与同一张表的关系(多对多?) - 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() 的方法关系?

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


【解决方案1】:

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

  1. 创建一个数据透视表并给它起一个有意义的名称,例如 relatives(person_person 不适合),并在此表 persion_id 和 relative_persion_id 中创建两个列。
  2. 使用类名,将其他三个参数作为表名(亲戚)、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”方法
    猜你喜欢
    • 2019-01-04
    • 1970-01-01
    • 2013-02-17
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多