Как создать рефлексивную связь в миграции Laravel и модели

#laravel #laravel-5 #eloquent

#laravel #laravel-5 #красноречивый

Вопрос:

Я хотел бы иметь, table который имеет one to many с самим собой. Например: у меня есть что-то вроде a, people table у которого может быть много других people .Вот как выглядит мой код:

 public function up()
{
    Schema::create('people', function (Blueprint $table) {
        $table->string('id')->primary();//Here my PK is a string
        $table->string('name');
        $table->string('title')->nullable();
        $table->string('parent_id');//Here is the foreign key of another person
        $table->timestamps();
    });
}
  

И в моем Person.php модель, у меня есть это:

 public function people()
{
    return $this->belongsTo('AppPerson')->withDefault();
}

public function person()
{
    return $this->hasMany('AppPerson');
}
  

Взгляните на это изображение:

Взаимосвязь, которую я пытаюсь реализовать

Ответ №1:

В Person.php модель:

 public function parent()
{
    return $this->belongsTo('AppPerson', 'parent_id');
}

public function child()
{
    return $this->hasMany('AppPerson', 'parent_id');
}
  

Комментарии:

1. да, это хорошо …. но название вашего отношения «один ко многим» — сделать дочернее , подобное The Person has many Child .

2. @jochri3 проверьте мой отредактированный ответ, чтобы установить родительские и дочерние отношения с использованием модели ‘Person’.

3. Большое вам спасибо

Ответ №2:

Добавьте parent_id в свою миграцию и определите связь в своей модели

 public function people()
   {
         return $this->belongsTo('AppPerson')->withDefault();
   }

   public function person()
 {
     return $this->hasMany(self::class, 'parent_id');
  }
  

Комментарии:

1. Итак, мой migration файл в порядке?

2. я думаю, что parent_id должен иметь значение null

3. Да, вы правы, parent_id должен иметь значение null. Я это сделал. Также благодарим