質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

3回答

7797閲覧

Laravelでdecimal型に空文字をinsertするとNULLで保存したいのに0になってしまう

Himamura

総合スコア39

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/08/17 00:28

Laravelで開発しています。

Laravelで数値が入力される入力フォームを入力して、その値をDBに保存する処理を作成しています。

入力フォームが空の状態で登録処理をかけると以下のSQLが発行されます。

SQL

1insert into `sale_details` (`tax_rate`, `tax_price`) values ('5.0', '')

本当であれば空の入力ならnullが入ってほしいのですが、このSQLが実行されると登録された値は「0.00」となります。

入力フォームの値が0ならば0が、空ならばnullが登録されるようにしたい場合、どのようにしたら良いでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

空文字とNULLは同じではありませんので空ならばnullが登録されるようにとした場合、SQLではなくPHP側で入力値によって自分で値をセットする必要があります。

投稿2019/08/17 01:32

m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Himamura

2019/08/17 01:49

ご回答ありがとうございます。コントローラ側で空文字をnullに変更することで解決しました。
m.ts10806

2019/08/17 02:10

それでなぜ自己解決なのでしょうか。
Himamura

2019/08/17 02:55

失礼いたしました! こういう場合は追記で書くようにいたします。 以後気をつけます。
m.ts10806

2019/08/17 02:57

そうですね。どう見ても回答者の回答で解決した内容なのに自己解決としてしまうと「自分で解決方法見つけた」ような印象を受けますので、ご注意ください。
Himamura

2019/08/17 03:00

ご指摘ありがとうございます。 そしてご回答が早くてめちゃくちゃ助かっています。 今後もよろしくお願いいたしますm(_ _)m
guest

0

解決方法がわかりました。
じつは今回の入力フォームは帳票形式の1対nのデータをひとつのリクエストで送信しており、n側のデータにおいて質問のようなSQLが発行されてしまっているという状態でした。
Laravel5.4移行にはリクエスト内のデータが空文字ならnullに自動で変えるミドルウェアが実装されているらしいのですが、今回n側のデータはリクエスト内に配列で代入していたため、そのミドルウェアが実行されなかったというのが原因のようです。そのため、コントローラ側で以下のような処理をいちど挟むことで、配列で渡した値を一度すべてチェックし、空文字をnullに変更するようにしました。

PHP

1 2 // データ内の空文字をnullに戻す 3 foreach ($arr_data as $key => $val) { 4 if ($val = '') $arr_data[$key] = null; 5 }

投稿2019/08/17 01:48

Himamura

総合スコア39

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/08/17 02:10

>if ($val = '') 式になってません。
m.ts10806

2019/08/17 02:11

>配列で渡した値を一度すべてチェックし、空文字をnullに変更するようにしました。 下策です。「NULLにしたいもののみ対応」にしてください。
Himamura

2019/08/17 02:51

ご回答ありがとうございます。式になっていない部分、エラーが出なかったので気づきませんでした。気をつけます。 このような感じでいかがでしょうか。 // データ内の空文字をnullに戻す $target_field = ['tax_price']; // 空文字の場合nullにしたいフィールドを配列で指定 foreach ($target_field as $val) { if ($arr_data[$val] == '') $arr_data[$val] = null; }
guest

0

SQL

1insert into `sale_details` (`tax_rate`, `tax_price`) values ('5.0', '') 23insert into `sale_details` (`tax_rate`, `tax_price`) values ('5.0', null)

で実行したらどうなりますか?

投稿2019/08/17 00:53

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Himamura

2019/08/17 01:49

ご回答ありがとうございます。コントローラ側で空文字をnullに変更することで解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問