我一直在寻找一个关于如何更新(保持同步)多对多关系的干净解决方案?
我有以下情况:
Sprint实体拥有与票证实体的多对多关系。
在编辑故障单(或Sprint,但我还没有)时,我希望能够选择(复选框)此故障单所属的Sprint。
持续(保存)后,我想更新我的联接表tickets_sprint
(这只是ticket_id
上的联接表,sprint_id
)。
向故障单添加Sprint似乎很容易,但从故障单中删除Sprint并没有反映出来。
代码
票证实体包含将票证添加到Sprint的方法:
public function setSprints($sprints) {
/**
* @var $sprint \AppBundle\Entity\Sprint
*/
foreach ($sprints as $sprint) {
$this->sprints[] = $sprint;
$sprint->addTicket($this);
}
}
我已阅读here,唯一可行的方法是删除所有关系并在持续时重新保存。
来自Laravel世界,这几乎不是一个好主意:) 这是在Laravel中完成的:
/**
* @param \App\User $user
* @param \App\Http\Requests\StoreUserRequest $request
* @return \Illuminate\Http\RedirectResponse
* Update the specified resource in storage.
*/
public function update(User $user, StoreUserRequest $request)
{
$user->fill($request->input());
$user->employee_code = strtolower($user->employee_code);
$user->roles()->sync($request->role ? : []);
$user->save();
\Session::flash('flash_message_success', 'The user was successfully updated.');
return redirect()->route('frontend::users.show', [$user]);
}
欢迎所有建议!
答案 0 :(得分:1)
您可以用来创建多个选择框的EntityType没有像CollectionType这样的by_reference选项。
如果您的故障单实体使用" inversedBy"另外,您不需要在其他对象中添加引用。所以你可以做到这一点:
public function setSprints($sprints) {
$this->sprints = $sprints;
}
也许这足以自动添加和删除您的元素(抱歉没有尝试过)。
否则你必须手动完成,你可以创建一个新方法来删除新的ArrayCollection和旧的ArrayCollection之间difference的元素返回。