Doctrineのドキュメントを注意深く読んだことがありますが、バージョン2.2では多対多の双方向の関係を設定できません。コードは次のとおりです。
アタッチメントエンティティ
/**
* @ORM\Entity
* @ORM\Table(name="attachment")
* @ORM\HasLifecycleCallbacks
*/
class Attachment
{
...
/**
* @var ArrayCollection $users
*
* @ORM\ManyToMany(targetEntity="User", inversedBy="attachments", cascade={"persist"})
* @ORM\JoinTable(name="users_attachments")
**/
private $users;
...
/**
* Get associated users
*
* @return ArrayCollection
*/
public function getUsers()
{
return $this->users;
}
/**
* Add User to this Attachment
*
* @return User
*/
public function addUser(User $user)
{
$this->users[] = $user;
return $this;
}
/**
* Add Users to this Attachment
*
* @param ArrayCollection
*/
public function setUsers($users)
{
$this->users = $users;
}
ユーザーエンティティ
/**
* @ORM\Entity
* @ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
...
/**
* @var \Doctrine\Common\Collections\ArrayCollection $attachments
*
* @ORM\ManyToMany(targetEntity="Attachment", mappedBy="users", cascade={"persist", "remove"})
* @ORM\JoinTable(name="users_attachments")
**/
private $attachments;
...
/**
* Add an Attachment
*
* @param ArrayCollection $attachments
* @return User
*/
public function setAttachments(ArrayCollection $attachments)
{
$this->attachments = $attachments;
return $this;
}
/**
* Add an Attachment
*
* @param Attachment $attachment
* @return User
*/
public function addAttachment(Attachment $attachment)
{
$this->attachments[] = $attachment;
return $this;
}
public function getAttachments()
{
return $this->attachments;
}
この設定で、次のものを機能させることができます(つまり、添付ファイルとユーザーが正しく保存されます)。
$attachment = $this->getDoctrine()
->getRepository('MyBundle:Attachment')
->find($attachment_id);
$attachment->addUser($this->getDoctrine()
->getRepository('MyBundle:User')
->find($user_id))
$em->persist($attachment);
$em->flush();
ただし、次のコードも機能させる必要があります(つまり、エラーは発生しませんが、関係は更新されません)。
$user = $this->getDoctrine()
->getRepository('MyBundle:User')
->find($user_id);
$user->addAttachment($this->getDoctrine()
->getRepository('MyBundle:Attachment')
->find($attachment_id))
$em->persist($user);
$em->flush();
添付ファイルを追加した後でUserエンティティを確認すると、エンティティがメモリに正しく格納されていることがわかりますが、EMがフラッシュされると、クエリは発行されません。
プロパティを適用する
cascade={"persist"}
列の定義に影響がないようです。間違いはどこにありますか?