如何在模型内部传递值以检查规则
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' => 'email|unique:driver_details,email,4,DriverId',
但即使我在控制器中使用$validation = Validator::make($DriverData, DriverModel::getUpdateRules($id));
时使用getUpdateRule,我也会收到Undefined variable: getUpdateRules
错误
您可能有错字。确保您使用的是DriverModel::getUpdateRules($id)
而不是DriverModel::$getUpdateRules($id)
。函数前面应该没有$
。以上是关于如何在模型内部传递值以检查规则的主要内容,如果未能解决你的问题,请参考以下文章
如何从将服务扩展到 MainActivity 的 LocationServices 活动传递纬度 n 经度值以在屏幕上显示它们而不是 Log.d