Laravel验证:存在附加列条件 - 自定义验证规则

时间:2014-09-30 12:54:46

标签: php validation laravel laravel-4 laravel-validation

在Laravel中指定存在的验证规则时,是否有一种引用另一个字段的方法?我希望能够说输入a必须存在于表a中,输入b必须存在于表b中且表b中列x的值必须等于输入a。

最好用例子解释:

public $rules = array(
    'game_id' => 'required|exists:games,id',
    'team1_id' => 'required|exists:teams,id,game_id,<game_id input value here>',
    'team2_id' => 'required|exists:teams,id,game_id,<game_id input value here>'
);

因此,根据我的验证规则,我希望能够确保:

  • game_id存在于games表(id字段)
  • team1_id存在于teams表(id字段)中,game_id列(位于teams表中)必须等于game_id表{1}}输入。
  • 如上team2_id

因此,如果在我的表单中,我为1输入game_id,我希望能够确保团队表中team1_id和{{1}的记录} team2_id的值为1

我希望这是有道理的。

由于

7 个答案:

答案 0 :(得分:11)

编辑:据说这在Laravel 5.5中不起作用。 @ user3151197回答可能会解决问题。

我使用的是Laravel 5.4,它可以为存在且唯一的规则添加自定义Rule。我认为这在5.3中出现了一段时间。

以下是我的方案:我有一个电子邮件验证表,我想确保在同一行上存在传递的机器代码和激活码。

请务必加入w

use Illuminate\Validation\Rule;

存在方法中的第一个争论是表格,第二个是我用于“mc”的自定义列名称。领域。我使用&#39;使用&#39;来传递我要检查的第二列。关键字然后在where子句中使用该字段。

这非常方便,因为现在我不再需要自定义验证规则。

答案 1 :(得分:10)

你想要custom validation rule,我会为此创建一个单独的类。但为简洁起见,使用内联闭包几乎相同:

// give it meaningful name, I'll go with game_fixture as an example
Validator::extend('game_fixture', function ($attribute, $value, $parameters, $validator) 
{
    if (count($parameters) < 4)
    {
        throw new \InvalidArgumentException("Validation rule game_fixture requires 4 parameters.");
    }

    $input    = $validator->getData();
    $verifier = $validator->getPresenceVerifier();

    $collection = $parameters[0];
    $column     = $parameters[1];
    $extra      = [$parameters[2] => array_get($input, $parameters[3])];

    $count = $verifier->getMultiCount($collection, $column, (array) $value, $extra);

    return $count >= 1;
});

然后简单地使用:

$rules = array(
    'game_id' => 'required|exists:games,id',

    // last parameter here refers to the 'game_id' value passed to the validator
    'team1_id' => 'required|game_fixture:teams,id,game_id,game_id',
    'team2_id' => 'required|game_fixture:teams,id,game_id,game_id'
);

答案 2 :(得分:4)

由于您的规则是模型属性,因此在运行验证程序之前需要对它们进行一些更改。

您可以将规则更改为:

public $rules = array(
    'game_id' => 'required|exists:games,id',
    'team1_id' => 'required|exists:teams,id,game_id,{$game_id}',
    'team2_id' => 'required|exists:teams,id,game_id,{$game_id}'
);

现在您需要使用循环来插入正确的值而不是{$game_id}字符串。

我可以告诉你我在编写规则时如何做到这一点:

public function validate($data, $translation, $editId = null)
{
    $rules = $this->rules;

    $rules = array_intersect_key($rules, $data);

    foreach ($rules as $k => $v) {
        $rules[$k] = str_replace('{,id}',is_null($editId) ? '' : ','.$editId , $v);
    }

    $v = Validator::make($data, $rules, $translation);

    if ($v->fails())
    {
        $this->errors = $v->errors();
        return false;
    }

    return true;
}

您可以将{$game_id}更改为$data['game_id'](在我的情况下,我将{,id}更改为,$editId

修改

当然如果你没有$rules设置属性,你可以这样做:

$rules = array(
    'game_id' => 'required|exists:games,id',
    'team1_id' => 'required|exists:teams,id,game_id,'.$data['game_id'],
    'team2_id' => 'required|exists:teams,id,game_id,'.$data['game_id']
);

在您拥有数据集的位置。

答案 3 :(得分:1)

试试这个适用于我的作品

'email'=>'required|unique:admintable,Email,'.$adminid.',admin_id',

答案 4 :(得分:1)

你可以试试这些的另一种方法

public $rules = array(
   'game_id' => 'required|exists:games,id',
   'team1_id' => 'required|exists:teams,id,game_id,'.$request->game_id,
   'team2_id' => 'required|exists:teams,id,game_id,'.$request->game_id
);

答案 5 :(得分:0)

如果其他人仍在使用Laravel 6或更高版本找到更好的解决方案,则只需添加带有“ exist”规则的字段名称,即可。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="Base.Theme.AppCompat" parent="Base.V26.Theme.AppCompat"/>
    <style name="Base.Theme.AppCompat.Light" parent="Base.V26.Theme.AppCompat.Light"/>
    <style name="Base.V26.Theme.AppCompat" parent="Base.V23.Theme.AppCompat">
        <!-- We can use the platform styles on API 26+ -->
        <item name="colorError">?android:attr/colorError</item>
    </style>
    <style name="Base.V26.Theme.AppCompat.Light" parent="Base.V23.Theme.AppCompat.Light">
        <!-- We can use the platform styles on API 26+ -->
        <item name="colorError">?android:attr/colorError</item>
    </style>
    <style name="Base.V26.Widget.AppCompat.Toolbar" parent="Base.V7.Widget.AppCompat.Toolbar">
        <item name="android:touchscreenBlocksFocus">true</item>
        <item name="android:keyboardNavigationCluster">true</item>
    </style>
    <style name="Base.Widget.AppCompat.Toolbar" parent="Base.V26.Widget.AppCompat.Toolbar"/>
</resources>

并检查game_id是否在“ teams”表中,您可以使用IN:规则。

类似的东西:

$rules = $request->validate([
   'game_id' => 'required|exists:games,id',
   'team1_id' => 'required|exists:teams,id,
   'team2_id' => 'required|exists:teams,id'
]);

我希望这会对某人有所帮助。

答案 6 :(得分:0)

检查NULL条件

'game_id' => 'required|exists:games,id,another_column,NULL',

您可以使用 (,) 列名和值添加更多条件。