首页 > 解决方案 > laravel 雄辩的一对一关系

问题描述

我有一个像这样的 Laravel 迁移

usergroups:

Schema::create('usergroups', function (Blueprint $table) {
    $table->integer('id')->primary();
    $table->string('name');
    $table->string('slug');
});

users:

Schema::create('users', function (Blueprint $table) {
    $table->integer('nik')->primary();
    $table->string('name');
    $table->string('username');
    $table->string('password');
    $table->string('telp', 15);
    $table->integer('usergroup_id');
    $table->rememberToken();
    $table->timestamps();
});
Schema::table('users', function ($table) {
    $table->foreign('usergroup_id')->references('id')->on('usergroups')->onDelete('cascade');
});

User模型

public function group()
{
    return $this->belongsTo(Usergroup::class, 'id');
}

Usergroup模型

public function user()
{
    return $this->hasMany(User::class, 'usergroup_id');
}

我用这个得到空白数据

$petugas = User::find(1);
return $petugas->group;

任何人帮助我,请...

标签: laravel

解决方案


首先,这不是一对一的关系。这是一对多的关系。根据迁移文件,您以错误的方式建立关系。

关系代码块应如下所示。

public function group()
{
    return $this->hasMany(Usergroup::class);
}

public function users()
{
    return $this->belongsTo(User::class);
}

更多信息:

在您的情况下,可能有两个可能的事实。

  1. 一个用户有很多组,但一个组只属于一个用户。
  2. 一个组有很多用户,但一个用户只属于一个组。

事实 1:在这种情况下,外键列应该放在组表中。要遵循约定,请user_idgroups表中创建外部列名。代码应该是这样的

public function groups()
{
    return $this->belongsTo(Usergroup::class);
}

public function user()
{
    return $this->hasMany(User::class);
}

事实 2:在这种情况下,外键列应该放在 users 表中。为了遵循约定,使表中的外部列名group_idusers关系代码应该如下所示

public function group()
{
    return $this->hasMany(Usergroup::class);
}

public function users()
{
    return $this->belongsTo(User::class);
}

推荐阅读