所以在laravel我有一个hasMany关系,让我们称之为果实。 用户每个水果只能有一个,而在个人资料页面上只有一个复选框。在这一刻 我有这个代码
if (!empty($data['fruits'])) {
$fruits = $data['fruits'];
foreach($user->fruits as $i) {
$i->delete();
}
for($a=0;$a<count($fruits);$a++)
{
$AT = new Fruits;
$AT->user_id=$user->id;
$AT->fruit_id=$fruits[$a];
$AT->save();
}
}
这样做是检查水果选择是否为空,如果不是,则删除与用户关联的现有水果并创建新水果。
这真的很难看,因为我感觉好像是。我不确定如何检查该用户是否已经存在水果ID,以及是否进行了创建。 任何帮助将不胜感激。
Schema::create('user_fruits', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->integer('fruit_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');
$table->foreign('fruit_id')->references('id')->on('fruits')->onUpdate('cascade')->onDelete('cascade');
$table->timestamps();
});
答案 0 :(得分:0)
对于任何关系,Eloquent的一个奇怪的遗漏是sync()
或甚至与save()
相反。所以你必须删除并重新添加。不涉及昂贵的多次删除和插入的替代方法是检查每个水果并删除(并添加)仅有必要的水果。我对此进行了密切监控,如果没有任何结果,我可能会制作一个PR来将其添加到Eloquent。
这是一种更清洁的方式来做你已经拥有的东西:
Fruits::where('user_id', $user->id)->delete();
$fruits = [];
foreach ($data['fruits'] as $key => $value) {
$fruit = new Fruits();
$fruit->id = $key;
$fruits[] = $fruit;
}
$user->saveMany($fruits);