我开始使用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();
}
它只适用于一个用户,我的函数在插入之前生成一个删除查询。
是否有针对此类问题的解决方案?
谢谢
答案 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
而不是普通数组。