Nano Hash - криптовалюты, майнинг, программирование

Заставить Laravel использовать значение MySQL по умолчанию при вставке/обновлении

Я заметил, что в Laravel (при использовании $model->fill(Input::all()) не имеет значения, как поступают данные) пустые поля (пустые в форме) отображаются как пустая строка (''). Это имеет смысл, поскольку именно так он доставляется из браузера на HTTP-сервер в PHP.

Проблема в том, что если столбец является числовым и имеет значение DEFAULT или NULLable, сгенерированный запрос от Eloquent имеет '' для значения столбца, поэтому MySQL интерпретирует это и вводит значение как 0, а не значение столбца по умолчанию или NULL. Это что-то, что я делаю неправильно, или мне нужно будет приложить дополнительные усилия (например, мутатор), чтобы обнаружить эту пустую строку и преобразовать ее в null для достижения того, чего я действительно хочу?

Конечно, я понимаю, что с технической точки зрения Laravel, не зная, как работают ваши столбцы, не может просто предположить, что пустая строка означает передачу NULL в запрос INSERT, потому что иногда вы действительно хотите установить поле (в частности, символ -основанный) на пустую строку, а не на NULL.

Тем не менее, я бы предпочел не определять мутаторы для всех моих моделей только потому, что я использую $model->fill(), но есть ли что-то, о чем я не знаю, что я могу сделать?


Для людей, читающих это MySQL, правильно ли установить числовое поле в 0, если передано ''? Похоже, что его следует рассматривать как NULL, так как это явно не 0, но я предполагаю, что это может быть слабая типизация, приравнивающая '' к 0, а не к более отдаленному NULL.



Ответы:


1

Есть очень простой способ сделать это, используя array_filter.

$input = array_filter(Input::all(), 'strlen');
$model->fill($input);

array_filter вернет все ключи, которым что-то назначено.

Есть некоторые предостережения с этим решением:

  • Был использован strlen, а не empty. Это связано с тем, что empty приведет к тому, что другие элементы (например, число 0) также будут отключены.
  • это означает, что изменения, сделанные с обновлением, такие как полное опустошение текстового поля, не будут выполняться вашим приложением, поэтому используйте его с умом!

EDIT: Что касается вопроса MySQL, да, это нормально.

mysql> SELECT CAST("tim?" AS SIGNED);
+------------------------+
| CAST("tim?" AS SIGNED) |
+------------------------+
|                      0 |
+------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: 'tim?' |
+---------+------+-------------------------------------------+
19.03.2014
  • Спасибо за ответ. Как я и опасался, нет хорошего способа заставить его работать просто волшебным образом. Тем не менее, я найду способ включить это в свой класс BaseModel и каким-то образом определить, следует ли игнорировать поле Give в '' или фактически предоставлять '' в MySQL. 19.03.2014

  • 2

    Чтобы значения по умолчанию были вставлены в некоторые поля, не задавайте значения для этих полей явно.

    Когда вы получите данные формы, обработайте каждое из полей и решите, для какого из них вы хотите вставить значения по умолчанию. Затем удалите их из инструкции insert into....

    Пример:
    Поля формы: field1_1, field_2.

    Если для обоих из них указан действительный ввод, вы можете написать оператор sql, например:

    insert into my_table values( field_1_value, field_2_value );
    

    Если одно из полей, скажем, field_2, не имеет допустимого ввода, и вы все еще хотите, чтобы запись попала в таблицу базы данных. Затем напишите оператор sql, например:

    insert into my_table( field_1 ) values( field_1_value );
    

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

    Примечание. Это работает, только если вы установили someValue по умолчанию для столбцов во время их создания или изменения в таблице базы данных.

    18.03.2014
  • Да, я понимаю, что если я создаю свои собственные запросы, я могу просто игнорировать поля, которые я не хочу передавать. Однако я подчиняюсь ORM Laravel PHP framework, и он генерирует запрос из всех полученных данных. В моей форме все поля указаны (даже если они пустые), и вот откуда проблема. Спасибо за попытку помочь. 18.03.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..