Laravel:同一张表,一对一的关系

Posted

技术标签:

【中文标题】Laravel:同一张表,一对一的关系【英文标题】:Laravel: Same table, One-to-One relationship 【发布时间】:2019-04-30 01:19:45 【问题描述】:

我有一个带有配偶字段的客户表,我正在引用该外键:

$table->integer('spouse')->nullable();
$table->foreign('spouse')->references('customerId')->on('customers');

我的问题是,如果我只能有一个名为 spouse() 的函数,我该如何设置函数以返回 belongsTo()hasOne()

public function spouse()

    return $this->hasOne('App\Customer');

谢谢。

【问题讨论】:

【参考方案1】:

您只需要定义一个函数:

# Customer.php

public function spouse()

    return $this->hasOne('App\Customer');

然后,当链接对象时,将对象相互关联

# CustomersController.php

$person_a = Customer::find(1);
$person_b = Customer::find(2);
$person_a->spouse()->save($person_b);
$person_b->spouse()->save($person_a);

然后使用它:

# CustomersController.php

$person_a = Customer::find(1);
$person_b = $person_a->spouse;
$person_a = $person_b->spouse;

观察

当使用不同于model_id的外键定义关系时,需要在定义关系时指定(查看docs):

# Customer.php

public function spouse()

    return $this->hasOne('App\Customer', 'spouse');

另外,这个外键列需要是unsignedInteger()(如果主键是integer)或bigUnsignedInteger(),如果外键是bigInteger

如果:

$table->increments('customerId');

做:

$table->unsignedInteger('spouse')->nullable();
$table->foreign('spouse')->references('customerId')->on('customers');

或者,如果:

$table->bigIncrements('customerId');

做:

$table->unsignedBigInteger('spouse')->nullable();
$table->foreign('spouse')->references('customerId')->on('customers');

【讨论】:

以上是关于Laravel:同一张表,一对一的关系的主要内容,如果未能解决你的问题,请参考以下文章

一对一关系还是使用同一张表?

使用 Android 房间数据库在同一张表中的一对多关系

Laravel5.1 模型 --一对一关系

Laravel - 以一对多关系获取最后一条记录

ThinkPHP5中模型的一对一关联关系

Laravel 一对多关系和一对一关系