使用Laravel验证处理这种情况的正确方法

使用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]和[Submitation_id]都是必需的

我对这两个输入的处理是:

  • 检查[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想要验证程序解决方案之前编写了它。代码最好在控制器中。