drqxfmfa804578 2019-04-29 17:19
浏览 65
已采纳

Laravel:同桌,一对一的关系

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.

  • 写回答

1条回答 默认 最新

  • dtttlua7165 2019-04-29 17:34
    关注

    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');
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
编辑
预览

报告相同问题?