Доктрина: как пропустить пустые / пустые столбцы при сохранении данных - PullRequest
0 голосов
/ 07 мая 2018

У меня есть такой репозиторий

/**
* @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

Я знаю, что я могу установить значение по умолчанию для защищенного телефона $, но как я могу сказать доктринуиспользовать значения по умолчанию из ORM \ Column или, что лучше, игнорировать «пустые» поля в процессе построения запроса?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Может быть, свойство обнуляемости может помочь? Вам не нужно указывать значение по умолчанию, и оно будет сохраняться

0 голосов
/ 07 мая 2018

Введение

Раньше у меня была почти аналогичная проблема, и я смог решить ее, используя Обратные вызовы жизненного цикла . Поскольку я не очень разбираюсь в 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:

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

  1. Я реализовал setHash и убедился, что он будет вызван после создания сущности:

/** * Set hash * * @ORM\PostPersist * @return NewsletterItem */ public function setHash() { $this->calculateHash(); return $this; }

  1. Я очистил кеш приложения

и тогда все заработало как шарм

Ваше решение

/**
* @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 специально для этой цели.

...