【问题标题】:Defining Laravel Relationship in Custom Primary Key and Foreign Key在自定义主键和外键中定义 Laravel 关系
【发布时间】: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,那么你的学生是未定义的。不是关系..你是如何找回学生的?

标签: php laravel relationship


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 2019-09-14
    • 1970-01-01
    相关资源
    最近更新 更多