在Laravel控制器中进行与其他字段的日期验证

huangapple go评论75阅读模式
英文:

Date validation with another fields in controller in Laravel

问题

如果 type =2,则 ldate 应大于 $eldate

英文:

Here is my validation code in the controller

  1. $eldate = Carbon::now()->addDay(4)->format('Y-m-d');
  2. $validatedData = $this->validate($request, [
  3. 'ldate' => 'required|date|unique:leaves,ldate,NULL,employee,employee,'.auth()->id(),
  4. 'ldate2' => 'nullable|date|after_or_equal:ldate',
  5. 'type' => 'required'
  6. ]);

In this validation code I have to add one more condition for date1

If type =2 then ldate should be greater than $eldate

答案1

得分: 1

使用自定义验证规则来解决此问题

  1. $eldate = Carbon::now()->addDay(4);
  2. $validatedData = $this->validate($request, [
  3. 'ldate' => ['required', 'date', 'unique:leaves,ldate,NULL,employee,employee,' . auth()->id(), function (string $attribute, mixed $value, Closure $fail) use ($request, $eldate) {
  4. if ($request->type == 2 && $eldate->gt($value)) {
  5. $fail("The {$attribute} is invalid.");
  6. }
  7. }],
  8. 'ldate2' => 'nullable|date|after_or_equal:ldate',
  9. 'type' => 'required'
  10. ]);

有关自定义验证规则的更多信息,请查看以下链接:

使用闭包

使用规则对象

英文:

use custom validation rules to solve the issue

  1. $eldate = Carbon::now()->addDay(4);
  2. $validatedData = $this->validate($request, [
  3. 'ldate' => ['required','date','unique:leaves,ldate,NULL,employee,employee,'.auth()->id(), function (string $attribute, mixed $value, Closure $fail) use ($request, $eldate) {
  4. if ($request->type==2 && $eldate->gt($value)) {
  5. $fail("The {$attribute} is invalid.");
  6. }
  7. }],
  8. 'ldate2' => 'nullable|date|after_or_equal:ldate',
  9. 'type' => 'required'
  10. ]);

For custom validation rules

Using Closures

Using Rule Objects

答案2

得分: 1

  1. 如果您正在使用Laravel Form Request,则只需添加
  2. public function rules()
  3. {
  4. $eldate = Carbon::now()->addDay(4)->format('Y-m-d');
  5. $rules = [
  6. 'ldate' => ['required', 'date', Rule::unique('leaves', 'ldate')->where(function ($query) {
  7. return $query->where('employee', auth()->id());
  8. })],
  9. 'ldate2' => 'nullable|date|after_or_equal:ldate',
  10. 'type' => 'required',
  11. ];
  12. if ($this->input('type') == 2) {
  13. $rules['ldate'][] = 'after:' . $eldate;
  14. }
  15. return $rules;
  16. }
英文:

If you're using Laravel Form Request, then simply add

  1. public function rules()
  2. {
  3. $eldate = Carbon::now()->addDay(4)->format('Y-m-d');
  4. $rules = [
  5. 'ldate' => ['required', 'date', Rule::unique('leaves', 'ldate')->where(function ($query) {
  6. return $query->where('employee', auth()->id());
  7. })],
  8. 'ldate2' => 'nullable|date|after_or_equal:ldate',
  9. 'type' => 'required',
  10. ];
  11. if ($this->input('type') == 2) {
  12. $rules['ldate'][] = 'after:' . $eldate;
  13. }
  14. return $rules;
  15. }

答案3

得分: 0

我可以展示如何使用自定义类,你可以在此处找到文档链接

控制器函数代码如下:

  1. public function test(Request $request)
  2. {
  3. $eldate = Carbon::now()->addDay(4);
  4. $rules = [
  5. 'ldate' => ['required', 'date', new ValidateDateTwo($eldate, $request->get('type'))],
  6. 'ldate2' => ['nullable', 'date', 'after_or_equal:ldate'],
  7. 'type' => 'required'
  8. ];
  9. $validator = Validator::make($request->all(), $rules);
  10. if ($validator->fails()) {
  11. $messages = $validator->errors();
  12. $errors = [];
  13. foreach ($rules as $input => $rule) {
  14. foreach ($messages->get($input) as $key => $message) {
  15. $errors[$input] = $message;
  16. }
  17. }
  18. return Response::json(['status' => false, 'errors' => $errors]);
  19. }
  20. return response()->json([
  21. 'status' => 'success',
  22. 'data' => [
  23. 'ldate' => $request->get('ldate'),
  24. 'ldate2' => $request->get('ldate2'),
  25. 'type' => $request->get('type')
  26. ]
  27. ]);
  28. }

验证类如下:

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Contracts\Validation\Rule;
  4. class ValidateDateTwo implements Rule
  5. {
  6. /**
  7. * @var mixed
  8. */
  9. private $eldate;
  10. /**
  11. * @var mixed
  12. */
  13. private $type;
  14. public function __construct($eldate, $type)
  15. {
  16. $this->eldate = $eldate;
  17. $this->type = $type;
  18. }
  19. public function passes($attribute, $value)
  20. {
  21. return $this->type != 2 || !$this->eldate->gt($value);
  22. }
  23. public function message()
  24. {
  25. return 'Your error message.';
  26. }
  27. }

我已经为你测试过了。

英文:

I can show how to use Custom Class
documentation: https://laravel.com/docs/10.x/validation#custom-validation-rules

controller function code

  1. public function test(Request $request)
  2. {
  3. $eldate = Carbon::now()-&gt;addDay(4);
  4. $rules = [
  5. &#39;ldate&#39; =&gt; [&#39;required&#39;, &#39;date&#39;, new ValidateDateTwo($eldate, $request-&gt;get(&#39;type&#39;))],
  6. &#39;ldate2&#39; =&gt; [&#39;nullable&#39;, &#39;date&#39;, &#39;after_or_equal:ldate&#39;],
  7. &#39;type&#39; =&gt; &#39;required&#39;
  8. ];
  9. $validator = Validator::make($request-&gt;all(), $rules);
  10. if ($validator-&gt;fails()) {
  11. $messages = $validator-&gt;errors();
  12. $errors = [];
  13. foreach ($rules as $input =&gt; $rule) {
  14. foreach ($messages-&gt;get($input) as $key =&gt; $message) {
  15. $errors[$input] = $message;
  16. }
  17. }
  18. return Response::json([&#39;status&#39; =&gt; false, &#39;errors&#39; =&gt; $errors]);
  19. }
  20. return response()-&gt;json([
  21. &#39;status&#39; =&gt; &#39;success&#39;,
  22. &#39;data&#39; =&gt; [
  23. &#39;ldate&#39; =&gt; $request-&gt;get(&#39;ldate&#39;),
  24. &#39;ldate2&#39; =&gt; $request-&gt;get(&#39;ldate2&#39;),
  25. &#39;type&#39; =&gt; $request-&gt;get(&#39;type&#39;)
  26. ]
  27. ]);
  28. }

And the Validation Class

  1. &lt;?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Contracts\Validation\Rule;
  4. class ValidateDateTwo implements Rule
  5. {
  6. /**
  7. * @var mixed
  8. */
  9. private $eldate;
  10. /**
  11. * @var mixed
  12. */
  13. private $type;
  14. public function __construct($eldate, $type)
  15. {
  16. $this-&gt;eldate = $eldate;
  17. $this-&gt;type = $type;
  18. }
  19. public function passes($attribute, $value)
  20. {
  21. return $this-&gt;type != 2 || !$this-&gt;eldate-&gt;gt($value);
  22. }
  23. public function message()
  24. {
  25. return &#39;Your error message.&#39;;
  26. }
  27. }

i have tested it for you.

huangapple
  • 本文由 发表于 2023年6月6日 15:28:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/76412318.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定