php - 不想编辑用于存储和更新功能的特定字段
问题描述
产品控制器
public function store()
{
$product = Product::create($this->validateRequest());
return redirect('/product');
}
public function update(Product $product)
{
$product->update($this->validateRequest());
return redirect('/product');
}
private function validateRequest()
{
return request()->validate([
'sub_category_id' => ['required'],
'name' => ['required', 'min:4'],
'code' => ['required', 'alpha_dash','unique:products'],
'description' => ['required', 'min:4'],
'color' => ['required', 'min:3'],
'price' => ['required', 'integer'],
]);
}
这里的代码在表格产品中具有独特的价值。但是每当我编辑表格时,它都会说代码已经采用。那么如何在不编辑“代码”(其唯一性)的情况下执行此操作。
解决方案
您可以在唯一检查期间忽略某些 id:
use Illuminate\Validation\Rule;
public function store()
{
Product::create($this->validateRequest(new Product()));
return redirect('/product');
}
public function update(Product $product)
{
$product->update($this->validateRequest($product));
return redirect('/product');
}
private function validateRequest(Product $product)
{
return request()->validate([
'sub_category_id' => ['required'],
'name' => ['required', 'min:4'],
'code' => ['required', 'alpha_dash', Rule::unique('products')->ignore($product)],
'description' => ['required', 'min:4'],
'color' => ['required', 'min:3'],
'price' => ['required', 'integer'],
]);
}
在这里,您要么在更新时传递现有模型,要么在存储时传递新模型实例,因此在存储新产品时调用$product->id
要么返回null
,因此不会忽略数据库中的产品,或者在更新时传递 id,然后仅忽略该产品。
从文档:
强制唯一规则忽略给定 ID:
有时,您可能希望在唯一检查期间忽略给定的 ID。例如,考虑一个包含用户名、电子邮件地址和位置的“更新配置文件”屏幕。您可能需要验证电子邮件地址是否唯一。但是,如果用户只更改名称字段而不更改电子邮件字段,则您不希望引发验证错误,因为用户已经是电子邮件地址的所有者。
为了指示验证器忽略用户 ID,我们将使用
Rule
该类来流畅地定义规则。在这个例子中,我们还将验证规则指定为一个数组,而不是使用 | 用于分隔规则的字符:
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::unique('users')->ignore($user->id),
],
]);
但请注意以下事项:
您永远不应将任何用户控制的请求输入传递给忽略方法。相反,您应该只传递系统生成的唯一 ID,例如来自 Eloquent 模型实例的自动递增 ID 或 UUID。否则,您的应用程序将容易受到 SQL 注入攻击。
推荐阅读
- c# - 数组中的 Elasticsearch 查询匹配
- javascript - 在存在事件之后创建事件
- javascript - 反应嘶嘶声
- python - AttributeError:“BoxLayout”对象没有属性,文本输入
- javascript - Office.js | 如何从工作簿中读取隐藏的工作表数据
- api - EWS 托管 API:会话不是复制项目上的 IMailboxSession
- python - 从乳房 X 光检查图像中去除字母伪影
- python - 如何将列表转换为 numpy.datetime64 格式
- javascript - 如何运行基于变量值的函数,该变量值依赖于规范茉莉花中的其他函数?
- c# - 如何在 C# vs 项目中创建清单以限制 AxInterop.MSTSCLib 的 mstscax.dll 搜索路径?