【问题标题】:Solve laravel validation for field with relation解决具有关系的字段的 laravel 验证
【发布时间】:2019-08-14 12:52:09
【问题描述】:

我遇到了一些问题,我的刀片模板在相关表上的下拉选择中验证失败。我试图搜索答案,但找不到。

在验证函数中临时注释掉数组内的字段'business_unit_id'以避免错误。

在控制器更新功能中:

    $item = CostCenter::findOrFail($id);
    $validatedData = $request->validate([
        'code' => 'bail|min:4|required|max:6',
        'descr' => 'bail|min:4|required|max:50',
        'business_unit_id' => 'required|integer',
    ]);

    $item->fill($validatedData);
    $item->business_unit_id = $request->businessUnit;

    $item->save();
    $request->session()->flash('status', 'Cost centers record was updated!');

    return redirect()->route('costCenters.show', ['cost_centers' => $item->id]);

在刀片模板中:

        <label for="businessUnit" class="col-sm-2 col-form-label">Business Unit</label>
            <select name="businessUnit" class="form-control">
                @foreach (App\Models\BusinessUnit::all() as $data)
                    <option value="{{ $data->id }}"
                        {{ old('business_unit_id', $cost_centers->business_unit_id ?? '1')
                            != $data->id ?: 'selected' }}>
                        {{ $data->code }} - {{ $data->descr }}
                    </option>
                @endforeach
            </select>

收到的通知是“需要业务单位 ID 字段”。使用我的错误助手。

【问题讨论】:

  • 您已将选择元素命名为"businessUnit"。它应该被命名为"business_unit_id"
  • 我之前尝试将控件命名为与需要验证的模型字段相同的名称,但验证不起作用。它呈现 SQLSTATE[23000] 错误:[Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Cannot insert the value NULL into column 'business_unit_id', table 'epms.dbo.cost_centers';列不允许空值。更新失败。 (SQL: update [cost_centers] set [business_unit_id] = ?, [cost_centers].[updated_at] = 2019-08-14 09:25:11.360 where [id] = 1)
  • 嗨 Suraj,只是为了让您知道,现在您的建议有效。我不明白为什么我以前尝试过的时候没有。
  • 我现在意识到它以前可能不起作用的原因是我在控制器中提交了“create”而不是“update”中的更改。谢谢。

标签: php laravel laravel-blade


【解决方案1】:
$validatedData = $request->validate([
    'code' => 'bail|min:4|required|max:6',
    'descr' => 'bail|min:4|required|max:50',
    'businessUnit' => 'required|integer',
]);

使用 businessUnit 代替 business_unit_id 因为我们必须使用选择标签的名称...... 不要使用选项标签的 id..

【讨论】:

  • 我之前也试过了,失败了,现在又试了,还是一样。 SQLSTATE[42S22]:[Microsoft][ODBC Driver 13 for SQL Server][SQL Server]列名“businessUnit”无效。 (SQL:更新 [cost_centers] 设置 [businessUnit] = 89,[cost_centers].[updated_at] = 2019-08-14 09:47:01.178 其中 [id] = 1)。我认为上面的评论更合适,因为选择名称与正在验证的字段相同。我只是不知道为什么它没有通过验证,即使确认传递给控制器​​的请求字段具有值。
  • 在验证数据之前,只需检查从刀片返回的所有数据......通过使用 dd($request->all());
【解决方案2】:

你可以试试这个代码...并使用代码中的 use 关键字,例如 use Validator;

    $rules = [
           'code' => 'bail|min:4|required|max:6',
           'descr' => 'bail|min:4|required|max:50',
           'businessUnit' => 'required|integer|exists:business_unit,id',
    ];

    $message = [
        'code.required' => 'code is required.',
        'descr.required' => 'description field is required.',
        'businessUnit.required' => 'The business unit id field is required.',

    ];

     $validator = Validator::make($request->all(), $rules,$message);
      if ($validator->fails()) {
      $arr = array("status"=>400,"msg"=>$validator->errors()- 
     >first(),"result"=>array());
      }
       else
       {
      your code write in this section
        }

【讨论】:

    【解决方案3】:

    对于控制器中的任何请求数据验证您可以这样尝试:

    $rule=array(
            'code' => 'bail|min:4|required|max:6',
            'descr' => 'bail|min:4|required|max:50',
            'business_unit_id' => 'required|integer',
    );
    $validator= Validator::make($request->all(),$rule);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-05
      • 2014-03-09
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 2017-12-29
      相关资源
      最近更新 更多