Автоматическое усечение значений доктрины при вставке - PullRequest
1 голос
/ 06 июня 2011

Я работаю над сценарием, который читает XML от стороннего партнера и помещает данные в таблицу базы данных.Я не контролирую длину или качество контента.Я хочу избежать добавления логики для проверки длины каждого поля.

Например: у меня есть столбец в базе данных mysql типа varchar (255), значение из импорта XML превышает 255 символов.Я хочу, чтобы Doctrine вставил первые 255 символов вместо того, чтобы выдавать исключение Doctrine_Validator_Exception с сообщением "1 валидатор не прошел проверку в заголовке (длина)"

Использование Doctrine 1.2

1 Ответ

1 голос
/ 23 июня 2011

Я знаю, что вы сказали, что "хотите избежать добавления логики для проверки длины каждого поля", но вы не указали, было ли это из-за соображений производительности или потому что их было много, и вы не хотели писатькод индивидуально.Если это последнее, я бы использовал что-то подобное в записи доктрины:

function set($fieldName, $value, $load = true) {
  switch($fieldName) {
  case 'id':
  case 'foo':
  case 'bar': 
    // list all of the fields that you DON'T want to truncate in this section
    break;
  default:
    $value = substr($value, 0, 255);
  }
  parent::set($fieldName, $value, $load);
}

Эта функция переопределяет метод set () по умолчанию в записи.Все поля будут усечены до 255 символов, которые не соответствуют тем, которые перечислены в первой части (id, foo, bar).

Если это не то, что вы хотите, вы можете разрешить MySQL делатьв случае усечения, выдается предупреждение, если вы пишете после длины столбца (1265 | Data truncated for column 'xxx' at row 1), но оно игнорируется Doctrine, когда запрос будет завершен.Для этого вы можете изменить тип столбца с «string» на «blob» и сделать второй параметр пустым вместо длины столбца, а затем просто установить соответствующие ограничения в MySQL.

...