如果我在迁移中没有使用 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;
请注意 passpoerdetials
列 Fk_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把确保唯一性的责任留给你,并在假设这个责任已经履行的情况下给出它的结果(因此第一个结果将是正确的)。
这是一个 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;
请注意 passpoerdetials
列 Fk_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把确保唯一性的责任留给你,并在假设这个责任已经履行的情况下给出它的结果(因此第一个结果将是正确的)。