所以在拉拉维尔我有一个有很多关系,让我们称之为水果。用户只能拥有每种水果中的 1 种,这是个人资料页面上的一个复选框。此刻我有这个代码
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();
});
Eloquent 的一个奇怪的遗漏与 save()
有很多关系sync()
甚至相反。因此,您必须删除并再次添加。一种不涉及昂贵的多次删除和插入的替代方法是检查每个水果并仅删除(和添加)必要的水果。我正在密切关注这一点,如果没有任何结果,我可能会做一个 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);