【问题标题】:Default value for foreign key外键的默认值
【发布时间】:2014-06-25 05:43:47
【问题描述】:

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

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

计划

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();
    }

    /* ... */
}


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

我希望我是清楚的,
提前谢谢你。

【问题讨论】:

  • 注释无法实现您想要做的事情。您可能应该只在单独的服务中拥有用于创建用户的逻辑,其中包括将此默认计划添加到用户。见this question
  • @Peter 我不知道怎么做,我尝试时它不起作用。
  • @ChadSikorra 我试过了,效果很好。但是,当我不使用控制器时,当我通过控制台或所有其他方式创建用户时,我也会将 plan_id 设置为 1。

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


【解决方案1】:

为此,您可以使用事件订阅者。

只要你调用$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));
    }
}

【讨论】:

    猜你喜欢
    • 2011-08-06
    • 2015-01-10
    • 2016-04-25
    • 2014-11-15
    • 2016-09-01
    • 2014-08-08
    • 2011-06-14
    • 2016-07-16
    • 1970-01-01
    相关资源
    最近更新 更多