如果我在迁移中没有使用 unique() 方法,laravel 如何跟踪一对一关系

How does laravel track a one-to-one relationship if i have not used the unique() method in my migration

这是一个 Laravel 和 SQL 相关的问题。基本上,如果我想在 SQL 中创建一对一关系,我会按如下方式进行:

CREATE TABLE dbo.Person
(
Pk_Person_Id INT IDENTITY PRIMARY KEY,
Name VARCHAR(255),
EmailId VARCHAR(255),
);

CREATE TABLE dbo.PassportDetails
(
Pk_Passport_Id INT PRIMARY KEY,
Passport_Number VARCHAR(255),
Fk_Person_Id INT UNIQUE FOREIGN KEY REFERENCES dbo.Person(Pk_Person_Id)
);

INSERT INTO dbo.Person VALUES ('Niraj','v.a@emails.com');
INSERT INTO dbo.Person VALUES ('Vishwanath','v.v@emails.com');
INSERT INTO dbo.Person VALUES ('Chetan','c.v@emails.com');
GO

INSERT INTO dbo.PassportDetails VALUES (101, 'C3031R33', 1);
INSERT INTO dbo.PassportDetails VALUES (102, 'VRDK5695', 2);
INSERT INTO dbo.PassportDetails VALUES (103, 'A4DEK33D', 3);
GO

SELECT * FROM dbo.Person
SELECT * FROM dbo.PassportDetails;

请注意 passpoerdetialsFk_Person_Id 是如何唯一的。

现在 Laravel 如果我想要一对一的关系,文档 here 说如下:

A one-to-one relationship is a very basic relation. For example, a User model might be associated with one Phone. To define this relationship, we place a phone method on the User model. The phone method should call the hasOne method and return its result:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get the phone record associated with the user.
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

我只是想知道如果在我的迁移中我没有使用 unique(),Laravel 如何跟踪这个 hasOne 关系?这让我有点困惑,我只是想更多地了解 Laravel 的深入工作,因此我问了这个问题。如果有人能为我解开这个谜,我将不胜感激。

P.S。这不是 HOW TO 问题,它更像是 WHY 问题。

简而言之:不是。

hasOne 关系表示您的数据的结构(即,$this->hasOne('App\Phone'); 表示您的 App\Phone table 有一个外键引用 User).但是,Laravel 无法确保此外键是唯一的。

如果您查看 the code for the hasOne relation,我们会看到:

/**
 * Get the results of the relationship.
 *
 * @return mixed
 */
public function getResults()
{
    return $this->query->first() ?: $this->getDefaultFor($this->parent);
}

换句话说,Laravel把确保唯一性的责任留给你,并在假设这个责任已经履行的情况下给出它的结果(因此第一个结果将是正确的)。