Glauco Fox
Glauco Fox

Reputation: 13

Laravel: Same table, One-to-One relationship

I have a customers table with a spouse field, I'm referencing that foreign key with:

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

My problem is, how do I set the function to return the belongsTo() and hasOne() if I can only have one function named spouse():

public function spouse()
{
    return $this->hasOne('App\Customer');
}

Thanks.

Upvotes: 1

Views: 355

Answers (1)

Kenny Horna
Kenny Horna

Reputation: 14241

You'll only need to define one function:

# Customer.php

public function spouse()
{
    return $this->hasOne('App\Customer');
}

Then, when link the objects, relate the objects with each other:

# CustomersController.php

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

Then to use it:

# CustomersController.php

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

Observation

When defining a relationship with a foreign key different to {model}_id, you need to specify it when defining the relationship (check the docs):

# Customer.php

public function spouse()
{
    return $this->hasOne('App\Customer', 'spouse');
}

Also, this foreign key column needs to be unsignedInteger() (in case of the primmary key is a integer) or bigUnsignedInteger() in case the foreign primmary key is bigInteger:

If:

$table->increments('customerId');

do:

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

Or, if:

$table->bigIncrements('customerId');

do:

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

Upvotes: 1

Related Questions