空字符串而不是空值 Eloquent拉拉维尔 4拉拉维尔 5

2022-08-30 14:21:41

我正在尝试使用批量分配雄辩功能创建实体...

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

问题是,通过这种方式,每个字段都用空字符串而不是我预期的值填充。null

我目前正在开发系统,但仍然没有定义一些表列,这就是为什么使用此方法,以避免将每个新字段添加到数组和...$fillablenew 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()

更新在过滤器有点乱。我最终做了:

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);
}

在我的函数中.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

工作完美。任何意见?


答案 1

我自己已经找到了这个问题的答案,我能想到的最接近的是使用Mutators(http://laravel.com/docs/eloquent#accessors-and-mutators)。

同样的问题通过添加一个(魔术!模型中外键字段的赋值函数方法:

public function setHeaderImageIdAttribute($value)
{
    $this->attributes['header_image_id'] = $value ?: null;
}

对于具有大量外键的表,这可能会变得有点笨重,但这是我发现的用于处理此问题的最“内置”的方法。好处是它很神奇,所以你所要做的就是创建方法,你就可以开始了。

更新 -- Laravel 5.4 及以上版本

从Laravel 5.4开始,中间件在收到请求时处理这个问题。在上面的示例中,如果请求包含“header_image_id”的空字符串值,则此中间件会自动将其转换为,然后我才能将其分配给我的模型。\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::classnull


答案 2

拉拉维尔 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');

推荐