使用Laravel验证处理这种情况的正确方法
我是拉雷维尔的新手,我想对如何处理这种情况有一些指导 我有两个实体:广告和提名。广告可以有很多提名 在控制器中,我接收到两个外部输入:[ad_id]和[Submitation_id]都是必需的 我对这两个输入的处理是:使用Laravel验证处理这种情况的正确方法,laravel,validation,laravel-validation,Laravel,Validation,Laravel Validation,我是拉雷维尔的新手,我想对如何处理这种情况有一些指导 我有两个实体:广告和提名。广告可以有很多提名 在控制器中,我接收到两个外部输入:[ad_id]和[Submitation_id]都是必需的 我对这两个输入的处理是: 检查[ad_id]是否是现有的ad实体,其属性“active”是否为true 检查[提名id]是否为现有提名实体 仅当[ad_id]是现有广告且[提名_id]是现有提名检查时,此提名是否属于此广告 你能给我举个例子说明如何只使用验证类来管理它吗?$inputAd=; $inp
- 检查[ad_id]是否是现有的ad实体,其属性“active”是否为true
- 检查[提名id]是否为现有提名实体
- 仅当[ad_id]是现有广告且[提名_id]是现有提名检查时,此提名是否属于此广告
$inputAd=;
$inputAd = <some_value>;
$inputNomination = <some_value>;
$nomination = Nomination::where(['id' => $inputNomination])->with(['ads'])->first();
if(!$nomination || !($nomination->ad_id == $inputAd)) {
// not the same
}
// same
$INPUTPONATION=;
$namignment=namignment::where(['id'=>$inputnamignment])->with(['ads'])->first();
如果(!$namignment | |!($namignment->ad_id==$inputAd)){
//不一样
}
//同样的
您可以这样编写验证规则
public function rules()
{
return [
'ad_id' => [
'bail',
'required',
Rule::exists('ads')->where(function ($query) use ($request) {
$query->where([
['active' => 1],
['id' => $request->ad_id]
]);
}),
],
'nomination_id' => [
'bail',
'required',
Rule::exists('nominations')->where(function ($query) use ($request) {
$query->where([
['ad_id' => $request->ad_id],
['id' => $request->nomination_id]
]);
}),
],
];
}
假设您有
ads
和提名
是表名,主键字段是id
和ad\u id
作为提名表中的外键。这非常简单-您可以编写验证规则,就像您在问题中列出的那样:
$validator=validator::make($request->only('ad\u id','namitment\u id')[
'ad_id'=>'必需|存在:ads,id,活动,1',
“提名id”=>“必需”存在:提名、id、广告id”。$request->广告id,
]);
如果($validator->fails()){
...
}
要验证广告id
和提名id
,您可以在规则中使用laravel
FormRequest类
public function rules()
{
return [
'ad_id' => [
'required',
Rule::in(Ad::where('active', true)->pluck('id')->toArray()),
],
'nomination_id' => [
'required',
Rule::in(Nomination::where('id', $this->nomination_id)->where('ad_id', $this->ad_id)->pluck('id')->toArray()),
],
];
}
规则::在(Ad::where('active',true)->pulk('id')->toArray())中,
规则将检查Ad
的id数组中是否存在Ad
,其中active
字段为true
Rule::in(提名::where('id',$this->namignment\u id)->where('ad\u id',$this->ad\u id)->pulk('id')->toArray(),
规则将检查提名id
是否存在于与ad
相关的提名的id数组中,该数组未看到最后一行。我的答案显示在controller.plusOne中。也许在这种情况下,只需指定id规则就足够了?有疑问的是,它提到在进行其他验证之前,应该对这两个字段进行检查。这样,就可以支持单独的消息。回答得好。使用Rule
helper进行这种琐碎的验证是多余的。18行代码而不是2行。答案无论如何都是正确的。在哪一部分中,您指定只需对现有实体的id[ad_id]和[NAMMETION_id]结果执行提名所有权检查?这是否检查id和ad_id是否属于同一行?@Tpojka什么id
是什么意思?我们在问题中有ad\u id
和提名id
。我们没有得到关于保存这些外键列的行的任何信息。我指的是验证器中的第二行。它是否检查ad_id是否属于找到提名id的正确行,或者只是检查提名表中任何一行是否存在ad_id?@Tpojka它通过id
和ad_id
列检查所述提名是否存在。我们没有收到关于这些外键列所在行的任何信息。为了验证它(假设我们有这一行的id
,它的表是行
),我们需要单独的规则:“id”=>“required”| exists:rows,id,ad_id”$请求->广告标识。“,提名号'$请求->提名\u id
。这取决于情况的背景,我们是否拥有这些信息,也需要验证这些信息<代码>“提名id”=>“必需”存在:提名、id、广告id“$请求->广告id
似乎应该有效。虽然此代码可以回答问题,但提供有关此代码为什么和/或如何回答问题的附加上下文可以提高其长期价值。@JensHabegger Correct。事实上,这不是正确的选择,因为我在checked OP想要验证程序解决方案之前编写了它。代码最好在控制器中。