因此,我尝试使用laravel更新数据库中具有多个字段的记录,但是我尝试在继续实际更新记录之前先验证输入。
所以我的问题是我的一个字段必须是唯一的,并且应该允许其他字段被编辑,即使那个字段没有被编辑。
我知道,在文档中,我们可以使用此代码来完成此操作。
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::unique('users')->ignore($user->id),
],
]);
但是,也会验证ignore方法中应该使用的id。
'product_id' => 'required|string|exists:' . Product::class,
'product_name' => 'required|unique:' . Product::class,
'product_stock_amount' => 'required|integer|numeric|gte:0',
'product_price' => 'required|integer|numeric|gte:0',
'product_price_currency' => 'required|string|',
'product_description' => 'nullable|string'
我不知道应该如何将文档中的建议应用到我的验证规则中。
我的想法是检查产品是否存在product_id
,然后继续进行其余的验证,但我不知道这是否正确,我担心这会使我的代码容易受到攻击。
如何解决这个问题有什么建议吗?
2条答案
按热度按时间lnlaulya1#
若要允许编辑多个字段,同时仍验证其中一个字段的唯一条件约束,您可以在验证规则中使用ignore方法,如下所示:
在此示例中,将验证product_name字段的唯一性,但将允许更新具有指定product_id的记录,即使product_name未更改。
请记住,应谨慎使用ignore方法以避免潜在的漏洞。在这种情况下,应使用exists规则验证product_id字段,以确保在ignore方法中使用指定的product_id之前,该字段存在于数据库中。这有助于防止提供不存在的product_id以绕过唯一约束的潜在攻击。
xfyts7mz2#
在您的情况下,您可以使用唯一规则的ignore方法来指定应该忽略目前产品的唯一规则。您可以将目前产品的product_id当做参数传递给ignore方法,如下所示:
这将确保product_name必须是唯一的,但如果当前产品与要更新的产品具有相同的product_name,则将忽略该名称。
验证请求中提供的product_id是否存在于products表中也是一个好主意。您可以使用exists规则来完成此操作,如上所示。这将有助于防止用户试图更新不存在的产品的攻击。
验证输入后,即可继续更新数据库中的产品。