【问题标题】:Save OneToOne relation in laravel在 laravel 中保存 OneToOne 关系
【发布时间】:2021-08-02 13:57:31
【问题描述】:

我有这个模型:

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

和语言模型:

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,因为我只想在表中保留语言ID。接下来我可以尝试什么?

【问题讨论】:

  • 你能发布两个模型的迁移文件吗?
  • 你的关系..我认为应该是User属于LanguageLanguagehasMany/hasOne用户..
  • @Prospero 我添加了。

标签: laravel eloquent laravel-8


【解决方案1】:

当您在用户模型中有hasOne 时:

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

eloquent 假设languages 表将具有language_id。因此出现错误“语言表中没有语言 ID”

所以,hasOne 应该在语言模型中定义。

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

而且,belongsTo 应该在用户模型中定义。

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

【讨论】:

  • 只是为了确认:现在,在您的 Lang 模型中,您有定义 hasOne 关系的用户函数,而在您的用户模型中,您有定义 belongsTo 关系的语言函数?同时删除该 language_id。
【解决方案2】:

作为第一个答案,更改关系的 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();

【讨论】:

  • 修改后有什么问题?
  • 同样的问题@Prospero
  • 您是否将 language_id 添加到可填充项中???您是否已经运行了 migrate 命令?
猜你喜欢
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 2019-12-19
  • 2021-06-04
相关资源
最近更新 更多