Формы Symfony2 интерпретируют пустые строки как нули - PullRequest
14 голосов
/ 29 марта 2012

У меня есть форма Symfony2 с множеством полей, включая одно необязательное текстовое поле с именем recap.

Это поле recap отлично сохраняет, когда в нем есть текст, но когда поле оставленопусто, я получаю эту ошибку:

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

Все верно - столбец recap не может быть null.Я поставил это так специально.Null означает неизвестное.Когда пользователь оставляет recap пустым, значение recap не является неизвестным;пусто.

У меня вопрос, как заставить Symfony сохранять recap как '', когда он пуст, а не null.

Ответы [ 7 ]

15 голосов
/ 29 марта 2012

Перейдите к вашей сущности и перейдите к объявлению переменных.

/**
 * @var string $name
 *
 * @ORM\Column(type="string", length=50)
 */
public $recap = '';

Вы можете назначить значение по умолчанию для $ recap.

Или в противном случае, когда у вас есть функция setRecap, вы можете проверить, пусто или нет, и установить ожидаемое значение.

public function setRecap($recap) {
   $this->recap = !isset($recap) ? '': $recap;
}

Или вы установили значение по умолчанию в форме Тип на '', но я думаю, что тогда это не то, что вы ожидаете.

11 голосов
/ 12 августа 2012

Правда, потерял много часов на нем ;-( "преобразование" жестко закодировано в компоненте Form.php, строка 1113!

private function viewToNorm($value)
{
    $transformers = $this->config->getViewTransformers();

    if (!$transformers) {
        return '' === $value ? null : $value;
    }

    for ($i = count($transformers) - 1; $i >= 0; --$i) {
        $value = $transformers[$i]->reverseTransform($value);
    }

    return $value;
}

На мой взгляд, это большая ошибка (потому что это роль DataTransformer, а не Form). Поэтому решение состоит в том, чтобы создать свой собственный DataTransformer и связать его с типом текста. В настоящее время я теряю так много времени с Symfony2, всегда ища в источниках такого рода мелкие взломы; - (

7 голосов
/ 20 мая 2015

У меня есть другое решение для этой проблемы:

создать фиктивный класс

class EmptyString {
    public function __toString() {
        return '';
    }
}

и установите

$builder->add('recap', 'text', [
    'empty_data' => new EmptyString(),
]);

Когда сущность будет сохранена в БД, она автоматически преобразуется в пустую строку.

5 голосов
/ 24 апреля 2012

Я думаю, что вы неправильно понимаете проблему: когда пользователь оставляет резюме, значение равно неизвестно, потому что не предоставлено.Например, вы не говорите, что пустое поле даты рождения означает, что дата рождения равна '', но эта дата рождения неизвестна.То же самое касается адресов и т.д ...

Так что, если ваш пользователь не обязан заполнять это поле, то кажется, что наиболее релевантным ответом на самом деле является установка вашего поля как обнуляемого

2 голосов
/ 16 июня 2016

В формах вы можете сделать:

$builder
->add('optionalField', TextType::class, ['required'=>false, 'empty_data'=>''])
2 голосов
/ 24 июня 2013

Только что натолкнулся на похожую ошибку в Symfony2:

Моя сущность:

/**
 * @ORM\Column(type="boolean")
 */
protected $Valid;

Моя форма:

$builder->add('Valid', 'hidden');

Теперь для истинных значений поле отображается правильно со значением = "1", но для ложных значений поле отображается со значением = "", что приводит к:

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

Хотя я ожидаю, что оно будет отображено как значение = "0".

Конечно, метод setValid () может быть улучшен для установки правильного значения:

public function setValid($valid)
{
    $this->Valid = ($valid ? true : false);
}

Который обходит проблему, а не исправляет ее.

0 голосов
/ 24 апреля 2012

Я тоже сталкивался с этой проблемой. И мне было предложено элегантное решение: сделать это определение @ORM\Column(type="string", length=50, nullable=true)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...