我正在使用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;
}
}
答案 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;
}
}