我正在尝试使用大量分配 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' => ...
    ...
));

有关如何执行此操作或修复的任何提示?

更新到现在为止,我已经在App::before()过滤器中使用array_filter进行了整理。

更新在过滤器中有点困惑。我最终做了:
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,则数据库将抛出错误,因为找不到外键“”。

完美的作品。任何意见?

最佳答案

使用模型“保存”事件查找空模型并将其显式设置为null。在此示例中,“项目”是我的模型的名称。将其放在一个辅助函数中,并将其连接到所有模型。

Project::saving(function($model) {
    foreach ($model->toArray() as $name => $value) {
        if (empty($value)) {
            $model->{$name} = null;
        }
    }

    return true;
});

LARAVEL 5的更新(2016年4月11日)

我还结束了创建Http中间件的工作,以清除http请求中的输入数据,以及在将数据发送到数据库之前对其进行清除。
class InputCleanup
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $input = $request->input();

        array_walk_recursive($input, function(&$value) {

            if (is_string($value)) {
                $value = StringHelper::trimNull($value);
            }
        });

        $request->replace($input);

        return $next($request);
    }
}

关于php - 空字符串而不是空值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17452923/

10-16 13:16