【Laravel】登録処理を行うときは入力値の空文字をNULLに置き換えた方が良いですね、って話
こんにちは、スズキです。
今回は登録処理を行う際は空文字をNULLに置き換えた方が良いですね、って話をします。
例えば、Laravelで登録処理を実装した場合、以下のような形で処理を実装することになると思います。
(なお、TestTableは「Illuminate\Database\Eloquent\Model」を継承したモデルクラスを指しています。)
基本的には上記処理でも問題ないのですが、DBフィールドが数値系、日付系の場合に入力値が空文字だと若干都合の悪い挙動になります。
動作確認した際には、入力値が空文字だと以下のような値が登録されていました。
今朝も外部キーを設定しているDBテーブルの登録画面を作成していたら、「外部キー制約に違反しています!!」って旨のエラーが出て登録できなかったりね・・・
(多分、「外部キー値として0を登録しようとする→参照先テーブルに「ID=0」のレコードが存在しない→エラー」って流れでエラーになっていたのだと思います)
で、いい加減不便だったので、空文字をNULLに置き換えるメソッドを作ることにしました。
作成したメソッドは以下になります。
使い方は以下のようになります。
ひょっとしたらパターン漏れがあるかもですが、
一応軽く動作確認してみた感じは問題なく意図した動作をしていました。
ちなみに、blade側で
今回は登録処理を行う際は空文字をNULLに置き換えた方が良いですね、って話をします。
例えば、Laravelで登録処理を実装した場合、以下のような形で処理を実装することになると思います。
(なお、TestTableは「Illuminate\Database\Eloquent\Model」を継承したモデルクラスを指しています。)
public function store(FormRequest $request) { $attributes = $request->all(); $model = TestTable::create($attributes); // 〜〜以下略〜〜 // }
基本的には上記処理でも問題ないのですが、DBフィールドが数値系、日付系の場合に入力値が空文字だと若干都合の悪い挙動になります。
動作確認した際には、入力値が空文字だと以下のような値が登録されていました。
- 数値系フィールド→0
- 日付系フィールド→「-0001-11-30 00:00:00」(処理上の値は0?)
今朝も外部キーを設定しているDBテーブルの登録画面を作成していたら、「外部キー制約に違反しています!!」って旨のエラーが出て登録できなかったりね・・・
(多分、「外部キー値として0を登録しようとする→参照先テーブルに「ID=0」のレコードが存在しない→エラー」って流れでエラーになっていたのだと思います)
で、いい加減不便だったので、空文字をNULLに置き換えるメソッドを作ることにしました。
作成したメソッドは以下になります。
/** * 入力値情報に対し、空文字をNULLに置き換えたものを取得します。 * @param $inputValues * @return array|null */ public static function convertInputEmptyValuesIntoNull($inputValues) { // 配列型以外の場合 if (!is_array($inputValues)) { // 空文字をNULLに置き換えたものを返す $retValue = (strlen($inputValues) > 0) ? $inputValues : null; return $retValue; } // 配列型の場合 $retValues = []; foreach ($inputValues as $key => $inputValue) { // 空文字をNULLに置き換える $convertValue = self::convertInputEmptyValuesIntoNull($inputValue); // 戻り値に追加 $retValues[$key] = $convertValue; } return $retValues; }
使い方は以下のようになります。
public function store(FormRequest $request) { $attributes = CommonUtility::convertInputEmptyValuesIntoNull($request->all()); $model = TestTable::create($attributes); // 〜〜以下略〜〜 // }
ひょっとしたらパターン漏れがあるかもですが、
一応軽く動作確認してみた感じは問題なく意図した動作をしていました。
ちなみに、blade側で
{!! Form::text('test[name]') !!} (※LaravelCollective5.2を使用)のような形で入力項目を配置した場合は「$attributes = $request->all()」の取得結果も
$attributes = [ 'test' => [ 'name' => '入力値です', ], ];
のような階層構造のデータとなりますが、
先ほど紹介した「空文字→NULL」置き換えメソッドは階層構造の場合も問題なく動作するように作成しているのでご安心ください。
先ほど紹介した「空文字→NULL」置き換えメソッドは階層構造の場合も問題なく動作するように作成しているのでご安心ください。