【问题标题】:How to add laravel validation for updates only once?如何只为更新添加一次 laravel 验证?
【发布时间】:2018-01-14 18:43:23
【问题描述】:

我的功能是这样更新的:

public function updateRating(UpdateRatingRequest $request) {
    $param = $request->only('id', 'rating');
    $id = $param['id'];
    $rating = $param['rating'];
    $review = Review::find($id);
    $review->rating = $rating;
    $review->save();
}

我的验证规则是这样的:

<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UpdateRatingRequest extends FormRequest {
    public function rules() {
        return [
            'id'=>'required',
            'rating'=>'required'
        ];
    }
}

我想添加验证服务器端 laravel。如果某个特定的 id 列、rating 列已经更新,则不能再次更新。所以每一个id,它的rating列只能更新一次

例如我有 id = 8。如果在 id = 8 上,评级列已更新。那么 id = 8 处的 rating 列就不能再更新了。所以只能更新一次

我该怎么做?

更新

这是我使用 mongodb 检查具有空评级的 id 的方法:

$reviews = Review::where('_id',$param['id'])->whereNull('rating')->first();

过程和laravel一样

【问题讨论】:

  • 该表中是否还有其他列可以更新?如果是这样,评分列在更新之前的值是多少?
  • 我认为您只需要添加一个列标志即可进行评级。假设名为 rating_updated 的列,该列具有类似于布尔值(真/假)的东西。是真的,那么评分栏已经更新了。您可以轻松检查。
  • @Ross Wilson,是的,它是 updated_date 列。更新前评分列的值为空
  • @wlisrausr, 是否不能通过栏目评分?更新前列评分为空

标签: laravel validation laravel-5.3 rules


【解决方案1】:

正如您在 cmets 中所说的那样,您可以使用 exists 验证规则:

public function rules()
{
    return [
        'id'     => [
            'required',
            Rule::exists('reviews')->where(function ($query){
                $query->whereNull('rating');
            })
        ],
        'rating' => 'required',
    ];
}

请注意,您必须在 UpdateRatingRequest 类中包含 Rule 外观的 use 语句:

use Illuminate\Validation\Rule;

希望这会有所帮助!

【讨论】:

  • 它不起作用。存在消息:The selected id is invalid.
  • 我使用 mongodb 和 mysql。评论表使用mongodb
  • @SuccessMan 我从未使用过 mongodb,所以我有一些未知数。您能否编辑您的问题以显示如何检查 mongodb 中的评级值是否为空?
  • 我已经更新了我的问题。看来它应该使用该模型。是否使用模型进行验证?
  • @SuccessMan 在这种情况下,如果 mongodb 是您的默认数据库连接,那么您只需要在exists() 列中指定列,即exists('reviews', '_id')。如果它不是您的默认连接,则还需要指定它,即exists('mongodb.reviews', '_id')(如果它不同,请将 mongodb 更改为您在配置文件中的名称)。如果这不起作用,请告诉我,因为您还可以做其他事情,但需要做更多的工作。
【解决方案2】:

一种方法是添加额外的列,例如“isEditable”,默认值为 1

然后在规则中 -

public function rules() {
    return [
        'id'=>'required',
        'rating'=> ['required', 'exists:isEditable,1']
    ];
}

更新时,将isEditable的值改为0,验证器将不允许再次更新。

【讨论】:

  • 是否不能过栏目评分?在更新列评级之前为空。所以我不需要添加额外的列
猜你喜欢
  • 2018-12-23
  • 2021-02-09
  • 2019-06-13
  • 2014-08-20
  • 2012-12-14
  • 1970-01-01
  • 2014-06-28
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多