Php laravel中一对一关系的create方法是否创建第二个条目?(Laravel 5.6,mysql)

Php laravel中一对一关系的create方法是否创建第二个条目?(Laravel 5.6,mysql),php,laravel,Php,Laravel,我有一对一的关系,一些用户应该得到一个代码,这是一个单独的模型 但是,当我调用create方法2次时,会创建第二个代码,而不会删除第一个代码 在我的用户模型中: public function code() { return $this->hasOne('App\Code'); } 在我的代码模型中 public function user() { return $this->belongsTo('App\User'); } 在我的迁移文件中 Schema::ta

我有一对一的关系,一些用户应该得到一个代码,这是一个单独的模型

但是,当我调用create方法2次时,会创建第二个代码,而不会删除第一个代码

在我的用户模型中:

public function code() {
    return $this->hasOne('App\Code');
}
在我的代码模型中

public function user() {
    return $this->belongsTo('App\User');
}
在我的迁移文件中

Schema::table('codes', function(Blueprint $table) {
        $table->unsignedInteger('user_id')->after('id');
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
现在,我要做的是对代码关系调用create方法两次:

$user->code()->create([
        'code' => 'flower'
    ]);
$user->code()->create([
        'code' => 'computer'
    ]);
//Now in my database, there are 2 code entries with the userid, one with computer and one with flower
当然,由于它是一对一的关系,我希望在创建第二个代码时删除第一个代码!
这是拉威尔的常见行为还是我做错了什么?是否每次保存新代码时都必须删除该代码?

如果您想一步删除并创建新代码,这是一种解决方法:

// in User model
public function replaceCode($codeName)

    $this->code()->delete();
    $this->code()->create([
            'code' => $codeName
        ]);

    return $this;
}

请注意,其他可能的方法(类似,但不完全相同)是根据您实际想要实现的目标取消链接、创建或更新。

如果您想在一个步骤中删除并创建新代码,这是一种方法:

// in User model
public function replaceCode($codeName)

    $this->code()->delete();
    $this->code()->create([
            'code' => $codeName
        ]);

    return $this;
}

请注意,其他可能的方法(类似但不完全相同)是根据您实际想要实现的目标取消链接、创建或更新。

解决此问题的一个简单方法是将变量与
->save()方法结合使用:

if(!$user->code){
  $code = new Code();
  $code->user_id = $user->id;
} else {
  $code = $user->code;
}

$code->code = "Flower";
$code->save(); 

这不会删除和替换用户的现有代码,而是更新它。取决于您是否希望更改
$code->id

解决此问题的一个简单方法是将变量与
->save()方法结合使用:

if(!$user->code){
  $code = new Code();
  $code->user_id = $user->id;
} else {
  $code = $user->code;
}

$code->code = "Flower";
$code->save(); 

这不会删除和替换用户的现有代码,而是更新它。取决于您是否希望更改
$code->id

如文档所述,该行为是正确的。如果要更改关系模型,可能需要使用
update
方法(还有
updateOrCreate
)。否则您需要删除旧记录。您是否尝试了
保存
而不是创建()?@alariva感谢您的回答!当我使用updateOrCreate方法时,代码不会更改,因为新代码是不同的。因此,使用它,我也得到了两个代码。@AfrazAhmad感谢您的建议,save方法还保留了附加的第一个代码:(@DonFattie它实际上取决于您在逻辑上愿意做什么,是否更新信息?是否替换模型?使用upadte,您至少需要一个键来标识模型(行)你想接触。除非你这样做,否则框架会解释你愿意添加。根据你的描述,我认为你应该删除和创建,因为你正在替换模型。你也可以取消链接并创建链接。但这取决于你到底想实现什么。行为是正确的,如文档所述。我如果要更改关系模型,可能需要使用
update
方法(还有
updateOrCreate
)。否则需要删除旧记录。是否尝试了
save
而不是create()?@alariva谢谢你的回答!当我使用updateOrCreate方法时,ofc的代码不会更改,因为新代码是不同的。因此,使用该方法,我也会得到两个代码。@AfrazAhmad谢谢你的建议,save方法还保留了附加的第一个代码:(@DonFattie这实际上取决于您在逻辑上愿意做什么,您是否在更新信息?您是否在替换模型?对于使用upadte,您至少需要一个键来标识模型(行)你想触摸。除非你这样做,否则框架将解释你愿意添加。根据你的描述,我相信你应该删除和创建,因为你是在替换模型。你也可以取消链接并创建链接。但这取决于你到底想实现什么。谢谢!我将完全使用这种方法,仅此而已好的。当然,把它作为一种发现你真正需要什么的方法。给进一步重构留出空间。谢谢!我会使用这种方法,效果很好。当然,把它作为一种发现你真正需要什么的方法。给进一步重构留出空间。