在自定义主键和外键中定义 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 关系的主要内容,如果未能解决你的问题,请参考以下文章