外键的默认值

时间:2014-05-08 02:02:57

标签: symfony doctrine-orm annotations entity foreign-key-relationship

上下文
我用symfony2开发了一个Rest API。我使用Doctrine,FOSUserBundle和FOSRestBundle 我用注释配置我的实体。我用控制台生成了我的实体。

我有两个实体:UserPlan User扩展了FOSUserBundle的FOS \ UserBundle \ Model \ User 这两个实体通过双向ManyToOne关系链接(一个计划的用户数量很多) 所以我在我的数据库的plan_id表中有一个int(11)类型的外键user 这是我的实体的代码:

计划

class Plan implements PlanInterface
{
    /* ... */

    /**
    * @ORM\OneToMany(targetEntity="...\UserBundle\Entity\User", mappedBy="plan")
    */
    private $users;

    public function __construct() 
    {
        $this->users = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /* ... */
}

用户

class User extends BaseUser
{
    /* ... */

    /**
    * @ORM\ManyToOne(targetEntity="...\PlanBundle\Entity\Plan", inversedBy="users")
    * @ORM\JoinColumn(columnDefinition="INT(11) default '1'")
    */
    private $plan;

    /**
     * Constructor
     */
    public function __construct()
    {
        parent::__construct();
    }

    /* ... */
}


问题
我希望在创建新用户时,在表plan的列plan_id中放置一个默认值(值为1的int,表示表user的第一个条目)

我希望我很清楚,
提前谢谢。

1 个答案:

答案 0 :(得分:0)

为此,您可以使用活动订阅者。

只要你打电话给$em->persist($user),就会调用听众,你可以执行任何你希望的行动。

class DefaultPlanSubscriber implements \Doctrine\Common\EventSubscriber
{
    public function getSubscribedEvents()
    {
        return array(
            'postPersist'
        );
    }

    public function postPersist(\Doctrine\ORM\Event\LifecycleEventArgs $args)
    {
        $em   = $args->getEntityManager();
        $user = $args->getEntity();

        if (false === $user instanceof \MyBundle\Entity\User) {
            return;
        }

        // Select plan by ID or some other sophisticated method of determining default.
        if(null === $plan = $em->getRepository('MyBundle:Plan')->find(1)) {
            return;
        }

        $user->setPlan($plan->addUser($user));
    }
}