在自定义主键和外键中定义 Laravel 关系

Posted

技术标签:

【中文标题】在自定义主键和外键中定义 Laravel 关系【英文标题】:Defining Laravel Relationship in Custom Primary Key and Foreign Key 【发布时间】:2021-12-12 18:45:36 【问题描述】:

我有 2 个表,它是一对一的关系模型类型。

学生表 = id|nik|name|address。帐户表 = id|nik|用户名|密码。

在这种情况下,每个学生都有一个帐户,我将 NIK 作为学生模型中的 $primaryKey。如何为此定义关系?提前致谢。

// Student Model
public function account()

    return $this->hasOne(Account::class, 'nik', 'nik');


// Account Model
public function student()

    return $this->belongsTo(Student::class, 'nik', 'nik');

【问题讨论】:

这里有什么问题?? @zahidhasanemon 当我尝试获取关系数据 $student->account 时,它会产生错误“尝试获取非对象的属性'帐户'”; 如果错误是Trying to get property 'account' of non-object,那么你的学生是未定义的。不是关系..你是如何找回学生的? 【参考方案1】:

在学生表中,您应该定义一个名为“account_id”的新列来表示学生帐户,并且它应该可以为空。

        $table->unsignedBigInteger('account_id')->nullable();
  $table->foreign('account_id')->references('nik')->on('accounts');

那么,你可以在你的关系中使用它:

// Student Model
public function account()

    return $this->hasOne(Account::class, 'account_id', 'nik');


// Account Model
public function student()

    return $this->belongsTo(Student::class, 'account_id', 'nik');

【讨论】:

// 学生模型 public function account() return $this->hasOne(Account::class, 'student_id', 'nik'); 这取决于应用要求,没有学生的帐户可以存在吗?【参考方案2】:

您不应该在两个表中重复一个字段 (nik),这违反了数据库规范化。您应该在 Account 表上创建 student_id。这样你就可以遵循 Laravel 的一对一关系标准。

// Student Model
public function account()

    return $this->hasOne(Account::class);


// Account Model
public function student()

    return $this->belongsTo(Student::class);

【讨论】:

以上是关于在自定义主键和外键中定义 Laravel 关系的主要内容,如果未能解决你的问题,请参考以下文章

SQL中啥叫主键,啥是外键,有啥关系

数据库中主键和外键是干嘛用的?

3.啥是键、候选键、主键和外键?

关于主键和外键

数据库中,主键是不能重复,唯一的,请问外键是否也不能重复的??

SQL server :主键和外键