如何在模型内部传递值以检查规则

Posted

技术标签:

【中文标题】如何在模型内部传递值以检查规则【英文标题】:How to pass the value inside the model for checking in the rules 【发布时间】:2015-03-28 03:36:34 【问题描述】:

我正在尝试在我的模型中使用此规则

'Email' =>  'email|unique:tablename,coloumntoignore,ignoreid',

上面的规则是检查除了ignoreid中要提供的id之外的唯一列

我在这里面临两个问题

我正在获取用户输入

$DriverData = Input::except(array('_token'));

并将其发送给模型

$validation  = Validator::make($DriverData, DriverModel::$updaterules);

注意:此更新不是自我更新,因此我无法通过Auth::user()->id 获取它,并且我的主键不是id

我检查它通过

'Email' =>  'email|unique:driver_details,email,4',

它告诉我错误

Column not found: 1054 Unknown column 'id' in 'where clause' (SQL: select count(*) as aggregate from `driver_details` where `email` = allaudeen.s@gmail.coms and `id` <> 4)

虽然我提到了protected $primaryKey = 'DriverId';

那么,我怎样才能获得模型内字段的值,以便我应该检查规则以检查除它之外的唯一列

注意:将 DriverId 放在控制器的会话中并像这样到达这里的肮脏方式是不受欢迎的。

【问题讨论】:

【参考方案1】:

试试

'email' => 'unique:table,email_column_to_check,id_to_ignore'
replace segments table, email_column_to_check, id_to_ignore in above example

参考:http://laravel.com/docs/4.2/validation#rule-unique

【讨论】:

【参考方案2】:

如果您使用资源丰富的路由/控制器,您尝试更新的记录的 id 应该是传递给控制器​​中更新方法的参数。

如果您没有使用资源丰富的路由/控制器,那么您正在更新的记录的 id 需要与其他表单数据一起传递。

关于验证规则,由于你的 id 字段不是id,你需要告诉规则。 unique 规则的第四个参数是 id 字段的名称。唯一规则的文档是here。

'Email' =>  'email|unique:driver_details,email,4,DriverId',

一旦您弄清楚如何获取正在更新的记录的 id,您将需要弄清楚如何将该 id 注入您的电子邮件规则。由于您的规则似乎被定义为DriverModel 上的静态属性,因此您可能需要查看此问题/答案here。基本上,您的规则中需要一个占位符,然后是模型上的一个静态方法,可以用您指定的 id 替换占位符:

class DriverModel extends Eloquent 
    public static $updaterules = array(
        'Email' => 'email|unique:driver_details,email,%1$s,DriverId'
    );
    public static function getUpdateRules($id = 'NULL') 
        $rules = self::$updaterules;
        $rules['Email'] = sprintf($rules['Email'], $id);
        return $rules;
    


// usage
$validation  = Validator::make($DriverData, DriverModel::getUpdateRules($id));

【讨论】:

感谢我克服了'Email' =&gt; 'email|unique:driver_details,email,4,DriverId', 但即使我在控制器中使用$validation = Validator::make($DriverData, DriverModel::getUpdateRules($id)); 时使用getUpdateRule,我也会收到Undefined variable: getUpdateRules 错误 您可能有错字。确保您使用的是DriverModel::getUpdateRules($id) 而不是DriverModel::$getUpdateRules($id)。函数前面应该没有$

以上是关于如何在模型内部传递值以检查规则的主要内容,如果未能解决你的问题,请参考以下文章

如何传递多个值以响应本机上下文 API

如何从将服务扩展到 MainActivity 的 LocationServices 活动传递纬度 n 经度值以在屏幕上显示它们而不是 Log.d

如何在 Vue 自定义中间件中获取 Vuex 更新的 getters 值以进行权限检查?

请听题:一个数据包如何在网络中传递?

如何从 <option><select> 传递值以形成动作

如何能够将变量传递给 gitlab ci 管道中的规则?