Php laravel中一对一关系的create方法是否创建第二个条目?(Laravel 5.6,mysql)
我有一对一的关系,一些用户应该得到一个代码,这是一个单独的模型 但是,当我调用create方法2次时,会创建第二个代码,而不会删除第一个代码 在我的用户模型中: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
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,您至少需要一个键来标识模型(行)你想触摸。除非你这样做,否则框架将解释你愿意添加。根据你的描述,我相信你应该删除和创建,因为你是在替换模型。你也可以取消链接并创建链接。但这取决于你到底想实现什么。谢谢!我将完全使用这种方法,仅此而已好的。当然,把它作为一种发现你真正需要什么的方法。给进一步重构留出空间。谢谢!我会使用这种方法,效果很好。当然,把它作为一种发现你真正需要什么的方法。给进一步重构留出空间。