Symfony 3 - 更新多对多

时间:2017-11-08 07:34:44

标签: symfony doctrine-orm many-to-many

我一直在寻找一个关于如何更新(保持同步)多对多关系的干净解决方案?

我有以下情况:

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]);
  }

欢迎所有建议!

1 个答案:

答案 0 :(得分:1)

您可以用来创建多个选择框的EntityType没有像CollectionType这样的by_reference选项。

如果您的故障单实体使用" inversedBy"另外,您不需要在其他对象中添加引用。所以你可以做到这一点:

public function setSprints($sprints) {
  $this->sprints = $sprints;
}

也许这足以自动添加和删除您的元素(抱歉没有尝试过)。

否则你必须手动完成,你可以创建一个新方法来删除新的ArrayCollection和旧的ArrayCollection之间difference的元素返回。