在laravel中保存OneToOne关系



我有这个模型:

class User extends Authenticatable
{
protected $fillable = [
'email',
'password',
'role_id',
];
.........
public function language() {
return $this->hasOne(Language::class, 'language_id');
}
}

And Language model:

class Language extends Model
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name',
'iso'
];
/**
* @return BelongsTo
*/
public function user()
{
return $this->belongsTo(User::class);
}

现在当我尝试保存用户:

$newUser->language()->save(Language::find($input['language']));

我得到错误:

Column not found: 1054 Unknown column 'language_id' in 'field list' (SQL: update `languages` set `language_id` = 4, `languages`.`updated_at` = 2021-08-02 13:51:32 where `id` = 1)"

用户迁移:

public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->integer('role_id')->default(UserRoles::TRANSLATOR);
$table->integer('language_id')->references('id')->on('languages')->nullable();
$table->rememberToken();
$table->timestamps();
$table->softDeletes();
});
}

语言迁移:

public function up()
{
Schema::create('languages', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->string('name');
$table->string('iso')->unique();
});
}

我确认我在users表中有语言id,在language表中没有user_id,因为我只想在表中保留language_id。接下来我可以尝试什么?

当用户模型中有hasOne时:

public function language() {
return $this->hasOne(Language::class, 'language_id');
}

eloquent假设languages表有language_id。因此错误'no language_id in languages table'

因此,hasOne应该在Language模型中定义。

//Language model
public function user() {
return $this->hasOne(User::class); //this assumes users table would have language_id
}

并且,belongsTo应该在User模型中定义。

//User model
public function language() {
return $this->belongsTo(Language::class);
}

作为第一个答案,更改关系的sintax并将language_id添加到可填充数组

用户模型
protected $fillable = [
'email',
'password',
'role_id',
'language_id'
];
public function language() {
return $this->belongsTo(Language::class);
}

和创建用户

$user = User::create(
'email' => ...
'password' => ...
'role_id' => ...
'language_id' => $input['language']
);

你可以在这里看到更多https://laravel.com/docs/8.x/eloquent-relationships#the-save-method,所以在这种情况下如果你想在这个关系上使用save方法你必须像

这样做
$language = Language::find($input['language']);
$language->user()->save($newuser);

我建议使用Laravel文档sintax来了解迁移中的关系

$table->foreignId('language_id')->constrained()->nullable();

最新更新