坚持联想symfony2

时间:2013-07-22 11:16:51

标签: symfony doctrine-orm associations persistence

我开始使用Doctrine2和协会,但我不了解所有方面。

我有2个php类:

class User extends BaseUser
{     
    protected $id;

    protected $team;

/**
 * Get id
 *
 * @return integer $id
 */
public function getId()
{
    return $this->id;
}

public function setId($id) {
    $this->id = $id;
}

public function getTeam() {
    return $this->team;
}

public function setTeam($team) {
    $this->team = $team;
}


}

/**
 * Team
 *
 * @ORM\Table(name="basket__team")
 * @ORM\Entity(repositoryClass="Tperroin\BasketBundle\Entity\TeamRepository")
 */
class Team
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="categorie", type="string", length=255)
 */
private $categorie;

/**
 * @var string
 *
 * @ORM\ManyToMany(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="users", cascade={"persist"})
 * @ORM\JoinTable(name="basket__team_user_coach")
 */
private $coachs;

/**
 * @var string
 *
 * @ORM\ManyToMany(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="users", cascade={"persist"})
 * @ORM\JoinTable(name="basket__team_user_player")
 */
private $players;

/**
 * @var string
 *
 * @ORM\Column(name="level", type="string", length=255)
 */
private $level;

我的问题是,当用户创建新的配置文件时,不会创建关联。

所以我在我的User类中使用PostPersist:

public function addTeam(LifecycleEventArgs $args) { 

    $entity = $args->getEntity(); 
    $em = $args->getEntityManager();

    $player = $this->getTeam();

    $player->setPlayers(array($entity));

    $em->persist($player);
    $em->flush();
}

它只适用于一个用户,我的函数在插入之前生成一个删除查询。

是否有针对此类问题的解决方案?

谢谢

1 个答案:

答案 0 :(得分:1)

您的ORM注释中存在一些错误:$coach$players都有targetEntity of User和相同的inveredBy属性。 inversedBy应该是User类的属性,它是多对多关联的另一面,例如$coachedTeams$playInTeams

您的addTeam代码会删除以前的关联,因为您调用$player->setPlayers(array($entity)):它会用新的关联替换旧的关联集合。您应该调用$ player-> addPlayer($ entity)来添加新对象到现有集合。

如果您使用php app/console doctrine:generate:entities生成实体,则不应使用方法setPlayers(),而应addPlayer()removePlayer()

请注意,与Doctrine的关联存储为Doctrine\Common\Collections\Collection而不是普通数组。