【问题标题】:How to prevent null values from being entered如何防止输入空值
【发布时间】:2013-09-24 16:55:15
【问题描述】:

我有一个简单的 foreach 循环,它检查每个选定的服务(来自 html 表单),然后通过 Laravel 4 模型将该信息保存到数据库中。信息保存得很好,但即使它为空,它也会保存 foreach 输入。如果数据被选中,我该如何保存?

控制器

  public function getServices() {
            $user = User::find(Auth::user()->id);   

            $input = [
                    'rooms' => Input::get('rooms'),
                    'pr_deodorizer' => Input::get('pr_deodorizer'),
                    'pr_protectant' => Input::get('pr_protectant'),
                    'pr_sanitizer' => Input::get('pr_sanitizer'),
                    'fr_couch' => Input::get('fr_couch'),
                    'fr_chair' => Input::get('fr_chair'),
                    'pr_sectional' => Input::get('pr_sectional'),
                    'pr_ottoman' => Input::get('pr_ottoman'),
                    'pr_tile' => Input::get('pr_tile'),
                    'pr_hardwood' => Input::get('pr_hardwood')
            ];

            $empty = '<i class="icon-warning-sign"></i> No services were selected. Need help? Contact us';                          

            if(empty($input['rooms']) && empty($input['pr_deodorizer']) && 
                    empty($input['pr_sanitizer']) && empty($input['pr_protectant']) 
                    && empty($input['fr_couch']) && empty($input['fr_chair'])
                    && empty($input['pr_sectional']) && empty($input['pr_ottoman'])
                    && empty($input['pr_tile']) && empty($input['pr_hardwood'])
                     ){
                return Redirect::to('book/services')->withErrors($empty)->withInput();
            } 

            foreach($input as $services)
            {
                $service = new Service();

                $service->userID = $user->id;
                $service->services = $services;

                $service->save();
            }
            return Redirect::to('book/schedule');
    }

它是这样保存到我的数据库中的:

id  userID  services    price   created_at  updated_at
171 1          3    NULL    2013-09-17 03:13:24 2013-09-17 03:13:24
172 1               NULL    2013-09-17 03:13:24 2013-09-17 03:13:24
173 1               NULL    2013-09-17 03:13:25 2013-09-17 03:13:25
174 1               NULL    2013-09-17 03:13:25 2013-09-17 03:13:25
175 1               NULL    2013-09-17 03:13:25 2013-09-17 03:13:25
176 1               NULL    2013-09-17 03:13:25 2013-09-17 03:13:25
177 1               NULL    2013-09-17 03:13:25 2013-09-17 03:13:25
178 1               NULL    2013-09-17 03:13:25 2013-09-17 03:13:25
179 1               NULL    2013-09-17 03:13:25 2013-09-17 03:13:25
180 1               NULL    2013-09-17 03:13:25 2013-09-17 03:13:25

服务栏是我正在查看的内容。用户选择了一个 serviceID 为 3 但没有别的服务。但它占用了空行,这会导致报告错误。我怎样才能让它只保存他们实际填充的数据? Laravel 4 验证是否可行?

【问题讨论】:

  • 它看起来不太像 Laravel... 考虑关注点分离。然后查看内置验证器助手来验证您的数据。您可以使用protected $guarded=[] 启用批量分配,然后从那里开始,逐个验证服务中的字段并将其注入控制器。如果您遵循最佳做法,您的控制器不应超过 5-10 行。
  • 不太清楚你的意思。 L4 没有任何类型的验证器来检查输入的任何字段(这就是我刚刚创建一个简单的 if(empty) 的原因)。如果我要清理阵列并再次检查这些阵列,那么控制器将大大缩小......这仍然是一个开发功能。但这与我的问题无关。
  • 这只是对您的代码的观察,但我的观点是,您可以将在那个巨大的 if 语句中重复的逻辑抽象到使用验证器的服务中,那么您所需要的就是 一个 isset。在laravel.com/docs/validation#custom-validation-rules 中查看“扩展验证器类”的文档
  • 好的,我会检查的。我并没有试图变得粗鲁或任何事情。我仍在学习并且不得不使用 hacky 代码来获得结果。然后我通常会回去清理。我会检查那个页面谢谢

标签: php laravel laravel-4


【解决方案1】:

我同意 elclanrs - 代码看起来不正确。

但是要回答你的问题 - 你不能这样做吗?

            foreach($input as $services)
            {
                $service = new Service();

                $service->userID = $user->id;
                $service->services = $services;

                if ( ! (is_null($services->services)))
                {
                    $service->save();
                }
            }

【讨论】:

  • 如果您在循环中使用 var_dump (%services->services) - 会显示什么?也许您需要检查 $services->services = "" - 因为它是一个空字符串而不是 null?
  • 不能 var_dump $services->services 因为它不存在。 var_dumping $service->services 只返回一个值“3”
猜你喜欢
  • 2014-02-14
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
相关资源
最近更新 更多