Reputation: 13
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
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;
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