如何在 Eloquent Orm 中实现自引用 (parent_id) 模型

2022-08-30 19:44:21

我有一个表,需要允许用户有一个父用户。User

该表将具有以下字段:

  • id
  • parent_id
  • email
  • password

我如何在Eloquent ORM中定义这种自我参照关系?


答案 1

我取得了这样的成功,使用了您的确切数据库表。

用户型号

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


推荐