0

エンティティ ユーザー

class User {

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;

    ...

    /**
     * @ORM\ManyToMany(targetEntity="Controleitor\Model\Entity\Account", mappedBy="user")
     */    
    protected $userAccount;   

    public function __construct() {
        $this->userAccount  = new \Doctrine\Common\Collections\ArrayCollection();
    }  
    public function getUserAccount() {
        return $this->userAccount;
    }   
    ...
}

エンティティ アカウント

class Account{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /** 
     * 
     * @ORM\ManyToMany(targetEntity="JasUser\Model\Entity\User", inversedBy="userAccount")
     * @ORM\JoinTable(name="user_has_account",
     *      joinColumns={@ORM\JoinColumn(name="idAccount", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="idUser", referencedColumnName="id")}
     *      )
     */    
    private $user;     

    public function __construct(array $options = null) {
        $this->user = new \Doctrine\Common\Collections\ArrayCollection();
    }       

    ...
}

テスト:

    $user = $this->entityManager->getRepository('User')->findOneById($id);        
    $user->getUserAccount()->add($account);

    $this->entityManager->persist($account);
    $this->entityManager->flush();
    $id = $entity->getId();

ユーザー、userAccount を取得し、データベースに新しいレコード アカウントを挿入しますが、期待どおりに、ユーザーとアカウント間の多対多の関連付けのレコードを user_has_account テーブルに追加しません。

4

1 に答える 1

0

関係の所有/逆側を後方に持っているようです。

所有側は、OneToOne、ManyToOne、または ManyToMany マッピング宣言の inversedBy 属性を使用する必要があります。inversedBy 属性には、逆側の関連付けフィールドの名前が含まれています。

関連の逆側のみに加えられた変更は無視されます。双方向の関連付けの両側 (または、Doctrine の観点からは、少なくとも所有側) を更新してください。

これはやや面倒です。

推奨される解決策は、コレクションを内部的にのみ操作することです。したがって、呼び出しコードを do にする代わりに、次の$user->getUserAccount()->add($account)ように実装します。

<?php
class Account {
    // ...
    public function addUser($user){
        $this->users->add($user);
    }
} 


class User { 
    // ...
    public function addAccount($account){
        // relation must be added from the owning side
        $account->addUser($this);
    }
}
于 2013-09-01T21:21:09.857 に答える