Doctrine:如何在持久化数据时跳过空/空列

时间:2018-05-07 10:41:50

标签: php doctrine-orm orm doctrine

我有像这样的存储库

/**
* @ORM\Entity()
* @ORM\Table(name="user_data")App\Models
*/
class UserData{
   /**
    * @ORM\Id
    * @ORM\Column(name="id", type="integer")
    * @ORM\GeneratedValue(strategy="AUTO")
    */
   protected $id;
   /**
    * @ORM\Column(type="string", length=255)
    */
   protected $email;
   /**
    * @ORM\Column(type="string", length=255, options={"default":""})
    */
   protected $telephone = '';
    /**
     * @return mixed
     */
    public function getId()
    {
        return $this->id;
    }

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

    /**
     * @param mixed $email
     */
    public function setEmail($email)
    {
        $this->email = $email;
    }

    /**
     * @return mixed
     */
    public function getTelephone()
    {
        return $this->telephone;
    }

    /**
     * @param mixed $telephone
     */
    public function setTelephone($telephone)
    {
        $this->telephone = $telephone;
    }
}

我确实有这个代码部分来创建用户

$user = new UserData();
$user->setEmail( $user_data['email'] );
App::DB()->persist($user);
App::DB()->flush();

其中App :: DB()包含我的enitymanager

如果我执行上面的代码,我会收到以下错误

An exception occurred while executing 'INSERT INTO user_data (email, telephone) VALUES (?, ?)' with params ["qwe@qwe.qwe", null]:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'telephone' cannot be null

我知道,我可以设置一个默认值给受保护的$ phone,但我怎么能告诉学说要么使用ORM \ Column中的默认值,要么更好地忽略'空&#39 ;查询构建过程中的字段?

2 个答案:

答案 0 :(得分:1)

简介

之前我遇到了类似的问题,我可以使用Lifecycle Callbacks解决问题。由于我对Symfony不是很有经验,我将首先解释我的问题和我的解决方案,然后在这个答案中处理你的问题。

我的问题

我有一个NewsletterItem实体,我需要为它创建hash,这取决于id,所以我需要设置hash的值创建记录后。我知道你需要在创建记录之前执行某些操作,但是请耐心等待几分钟,我认为这将是你花费很多时间的时间,因为我很乐意看到以前的经验。在你的情况下,有一个几乎相似的问题。

我的解决方案

  1. 我一直在使用Doctrine\ORM\Mapping as ORM

    use Doctrine\ORM\Mapping as ORM;

  2. 我指定该实体具有生命周期回调:

     /**
     * ...
     * @ORM\HasLifecycleCallbacks
     */
    

    class NewsletterItem implements \Serializable {

  3. 我已确定我有一个初始化hash的方法:

  4. private function calculateHash() { //Here I set the hash based on id, among others and return it }

    1. 我实施了setHash并确保在创建实体后调用它:
    2. /** * Set hash * * @ORM\PostPersist * @return NewsletterItem */ public function setHash() { $this->calculateHash(); return $this; }

      1. 我清除了应用程序的缓存
      2. 然后一切都像魅力一样

        您的解决方案

        /**
        * @ORM\Entity()
        * @ORM\Table(name="user_data")App\Models
        * @ORM\HasLifecycleCallbacks
        */
        class UserData{
           /**
            * @ORM\Id
            * @ORM\Column(name="id", type="integer")
            * @ORM\GeneratedValue(strategy="AUTO")
            */
           protected $id;
           /**
            * @ORM\Column(type="string", length=255)
            */
           protected $email;
           /**
            * @ORM\Column(type="string", length=255, options={"default":""})
            */
           protected $telephone = '';
            /**
             * @return mixed
             */
            public function getId()
            {
                return $this->id;
            }
        
            /**
             * @return mixed
             */
            public function getEmail()
            {
                return $this->email;
            }
        
            /**
             * @param mixed $email
             */
            public function setEmail($email)
            {
                $this->email = $email;
            }
        
            /**
             * @return mixed
             */
            public function getTelephone()
            {
                return $this->telephone;
            }
        
            /**
             * @ORM\PrePersist
             * @param mixed $telephone
             */
            public function setTelephone($telephone)
            {
                $this->telephone = ($telephone ? $telephone : '');
            }
        }
        

        我从未尝试过我建议的内容,所以如果它不起作用,那么您可能需要专门用于此目的的initializeTelephone方法。

答案 1 :(得分:1)

也许nullable属性可以提供帮助吗?您无需提供默认值,它将保留