如何将实体id与字符串连接起来以生成代码用户?

时间:2017-03-15 11:01:42

标签: php symfony doctrine-orm

我正在使用Symfony和Doctrine开发一个应用程序,我需要生成一个代码用户,其前缀包含总是5个数字,如(42153),然后附加到用户ID的前缀(421530001),( 421530002),(421530003)。

我想在类构造函数中执行此操作,例如$this->codeAd = ???

<?php

namespace Pharmagadir\AdhereBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Adhere
 *
 * @ORM\Table(name="adhere")
 * @ORM\Entity(repositoryClass="Pharmagadir\AdhereBundle\Repository\AdhereRepository")
 */
class Adhere
{
    public function __construct(){
        $this->codeAd = ??? # <-- what to add here???
    }
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

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

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


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

    /**
     * Set nom
     *
     * @param string $nom
     *
     * @return Adhere
     */
    public function setNom($nom)
    {
        $this->nom = $nom;

        return $this;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }


    /**
     * Set email
     *
     * @param string $email
     *
     * @return Adhere
     */
    public function setEmail($email)
    {
        $this->email = $email;

        return $this;
    }

    /**
     * Get email
     *
     * @return string
     */
    public function getEmail()
    {
        return $this->email;
    }



    /**
     * Set codeAd
     *
     * @param string $codeAd
     *
     * @return Adhere
     */
    public function setCodeAd($codeAd)
    {
        $this->codeAd = $codeAd;

        return $this;
    }

    /**
     * Get codeAd
     *
     * @return string
     */
    public function getCodeAd()
    {
        return $this->codeAd;
    }
}

1 个答案:

答案 0 :(得分:2)

您无法在Entity构造函数中创建它,因为它仅在您持久化对象时才创建它的实体ID。所以,初看起来实现这种行为的最简单的解决方案(还有其他方法,但对于这样一个简单的任务来说是一种过度杀伤)是使用{{1} } Doctrine event

  

postPersist - postPersist事件发生在一个实体之后   实体已经坚持不懈。它将在数据库之后调用   插入操作。生成的主键值可在   postPersist活动。

然后,您可以在How to Work with Lifecycle Callbacks之后的实体中以及自定义函数中实现它:

postPersist

但为什么数据库没有使用postPersist事件中设置的值更新???

这是由于postupdate-postremove-postpersist events上的解释,其中陈述:

  

在EntityManager#flush()中调用三个post事件。变化   在这里与数据库中的持久性无关,但是你   可以使用这些事件来更改非可持久化项目,例如非映射项目   字段,日志记录甚至不是直接关联的类   由Doctrine映射。

因此,要解决此问题并将修改应用于数据库,最简单的解决方案是将同一对象刷新两次,如:

/**
 * Adhere
 *
 * @ORM\Table(name="adhere")
 * @ORM\Entity(repositoryClass="Pharmagadir\AdhereBundle\Repository\AdhereRepository")
 * @ORM\HasLifecycleCallbacks() <--- add this line
 */
class Adhere
{
   #------------- other code

   /**
    * @ORM\PostPersist
    */
    public function setCodeAd()
    {
        // generate a random integer with 5 numbers like (42153)
        $randomCode = rand(10000, 99999);
        $this->codeAd = (string)$randomCode . $this->id;

        return $this;
    }
}