web-dev-qa-db-ja.com

Doctrine 2ManyToManyカスケード

Doctrine 2で、多対多の関連する2つのオブジェクトを作成し、それらの1つだけでpersistを呼び出して、両方を保存することは可能ですか?

ユーザーエンティティ:

    /**
 * Owning Side
 *
 * @ManyToMany(targetEntity="Role", inversedBy="users", cascade={"persist"})
 * @JoinTable(name="user_roles",
 *      joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@JoinColumn(name="role_id", referencedColumnName="id")}
 *      )
 */
public $roles;

役割エンティティ:

    /**
 * Inverse Side
 *
 * @ManyToMany(targetEntity="User", mappedBy="roles")
 */
public $users;

保存:

    $role = new Role();

    $user = new User();

$user->roles->add($role);
$role->users->add($user);

$em->persist($user);
$em->flush();

それは機能せず、「永続化操作をカスケードするように構成されていない関係を通じて新しいエンティティが見つかりました:Entities\Role @ 0000000004a29c11000000005c48cb75。新しいエンティティを明示的に永続化するか、関係にカスケード永続化操作を構成します。」

18
awattar

cascade={"persist"}をRoleエンティティに適用する必要があります。

Doctrineの専門家ではありませんが、Doctrineは、カスケードオプションについて関連するエンティティをチェックすると思います。

永続化fromユーザーからRoles、カスケードで永続化する必要があるかどうかRoleエンティティをチェックします。

12
Hakan Deryal