Как реализовать модель самореференции (parent_id) в Eloquent Orm

У меня есть таблица User и нужно разрешить пользователям иметь родительского пользователя.

таблица будет иметь поля:

  • id
  • parent_id
  • email
  • password

Как бы я определил это отношение самореализации в Eloquent ORM?

Ответ 1

У меня был такой успех, используя вашу точную таблицу DB.

Модель пользователя:

class User extends Eloquent {

    protected $table = 'users';
    public $timestamps = false;

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

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

}

а затем я мог бы использовать его в своем коде следующим образом:

$user     = User::find($id);

$parent   = $user->parent()->first();
$children = $user->children()->get();

Попробуйте и дайте мне знать, как вы продвигаетесь!

Ответ 2

У меня была цепочка самореферентных контрактов (контракт может быть продолжен другим контрактом), а также необходимо саморейтирование. Каждый контракт имеет нулевой или один предыдущий, а также нулевой или один следующий контракт.

Таблица моих данных выглядела следующим образом:

+------------------+  
| contracts        |  
+------------------+  
| id               |  
| next_contract_id |  
+------------------+  

Чтобы определить обратную связь (предыдущий контракт), вы должны инвертировать связанные столбцы, что означает настройку  * столбец внешнего ключа на таблице моделей  * связанный столбец в родительской таблице (это одна и та же таблица)

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Contract extends Model {

    // The contract this contract followed
    function previousContract()
    {
        // switching id and next_contract_id
        return $this->belongsTo('App\Contract', 'id', 'next_contract_id');
    }

    // The contract that followed this contract
    function nextContract()
    {
        return $this->belongsTo('App\Contract');
        // this is the same as
        // return $this->belongsTo('App\Contract', 'next_contract_id', 'id');
    }
}

Подробнее см. http://laravel.com/docs/5.0/eloquent#one-to-one.