31

一括割り当てEloquent機能を使用してエンティティを作成しようとしています...

$new = new Contact(Input::all());
$new->save();

問題は、この方法では、すべてのフィールドnullに期待どおりの値ではなく空の文字列が入力されることです。

私は現在システムを開発していますが、まだいくつかのテーブルの列が定義されていません。そのため、このメソッドを使用して、すべての新しいフィールドを$fillable配列とnew Contact(array(...));...

また、このテーブルには約 20 のフィールドがあるため、次のような配列があると少し見苦しくなります。

$new = new Contact(array(
    'salutation' => Input::get('salutation'),
    'first_name' => Input::get('first_name'),
    'last_name'  => Input::get('last_name'),
    'company_id' => Input::get('company_id'),
    'city' => ...
    ...
));

これを行う方法または修正する方法のヒントはありますか?

更新これまでに、フィルターで array_filter を実行してこれを整理しましたApp::before()

Update Inフィルターは少し混乱していました。私はやってしまう:

public static function allEmptyIdsToNull()
{
    $input = Input::all();

    $result = preg_grep_keys ( '/_id$/' , $input );

    $nulledResults = array_map(function($item) {
        if (empty($item))
            return null;

        return $item;
    }, $result);

    return array_merge($input, $nulledResults);
}

そして、私の functions.php で。

if ( ! function_exists('preg_grep_keys'))
{
    /**
    * This function gets does the same as preg_grep but applies the regex
    * to the array keys instead to the array values as this last does.
    * Returns an array containing only the keys that match the exp.
    * 
    * @author Daniel Klein
    * 
    * @param  string  $pattern
    * @param  array  $input
    * @param  integer $flags
    * @return array
    */
    function preg_grep_keys($pattern, array $input, $flags = 0) {
        return array_intersect_key($input, array_flip(preg_grep($pattern, array_keys($input), $flags)));
    }
}

今のところ、「_id」で終わるフィールドのみを操作しています。これは私の最大の問題です。リレーションシップが ではないNULL場合、データベースは外部キー "" が見つからないためエラーをスローします。

完璧に動作します。任意のコメント?

4

7 に答える 7

19

ララベル4

必要に応じて、フィルタリングによって配列内の空の文字列を削除できます。

$input = array_filter(Input::all(), 'strlen');

次に、次のようなものがあれば、次のようarray('a' => 'a', 'b' => '')になりますarray('a' => 'a')

私の知る限り、一括代入の配列でフィールドが指定されていない場合、Laravel Eloquent ORM はそれを のように扱いNULLます。


ララベル5

$input = array_filter(Request::all(), 'strlen');

また

// If you inject the request.
$input = array_filter($request->all(), 'strlen');
于 2013-07-03T16:26:22.010 に答える
12

おそらくより一般的な解決策:

class EloquentBaseModel extends Eloquent {

    public static function boot()
    {
        parent::boot();

        static::saving(function($model)
        {
            if (count($model->forcedNullFields) > 0) {
                foreach ($model->toArray() as $fieldName => $fieldValue) {
                    if ( empty($fieldValue) && in_array($fieldName,$model->forcedNullFields)) {
                        $model->attributes[$fieldName] = null;
                    }
                }
            }

            return true;
        });

    }

}

空のフォーム フィールドをサニタイズする必要があるモデルは、このクラスを拡張する必要があります。次に、空のフォーム フィールドの場合に NULL にする必要があるフィールド名を $forcedNullFields 配列に入力する必要があります。

class SomeModel extends EloquentBaseModel {
    protected $forcedNullFields = ['BirthDate','AnotherNullableField'];
}

以上で、ミューテーターで同じコードを繰り返さないでください。

于 2014-10-28T07:47:53.977 に答える
1

フォーム入力の場合、null 値よりも空の値の方が正常であり、より論理的です。

これを行う最善の方法は、入力をデータベースに直接入れることだと本当に思うなら、空の値を null にする解決策は次のようになります。

$input = Input::all();
foreach ($input as &$value) {
    if (empty($value) { $value = null; }
}
$new = new Contact(Input::all());
$new->save();

個人的には、この種のソリューションを承認しませんが、一部の人には有効です。

于 2013-07-03T16:18:24.553 に答える
-2

Eloquent モデルで、$guardedが空であることを確認します。設定する必要はありません$fillable

一括割り当ては通常は良い考えではありませんが、シナリオによっては問題ありません。いつ行うかを決定する必要があります。

参照: http://laravel.com/docs/eloquent#mass-assignment

于 2013-07-03T16:14:15.903 に答える