Validation Laravel验证:具有多列和软删除功能
我正在尝试执行以下Laravel验证规则:Validation Laravel验证:具有多列和软删除功能,validation,laravel,laravel-4,Validation,Laravel,Laravel 4,我正在尝试执行以下Laravel验证规则: "permalink" => "required|unique:posts,permalink,hotel_id,deleted_at,NULL|alpha_dash|max:255", 对规则的解释如下: 我的系统中有一个“Posts”表,其中包含以下字段:hotel\u id、permalink、deleted\u at。如果MySQL允许创建具有空值的唯一索引,则sql将是: ALTER TABLE `posts` ADD UNIQUE
"permalink" => "required|unique:posts,permalink,hotel_id,deleted_at,NULL|alpha_dash|max:255",
对规则的解释如下:
我的系统中有一个“Posts”表,其中包含以下字段:hotel\u id、permalink、deleted\u at。如果MySQL允许创建具有空值的唯一索引,则sql将是:
ALTER TABLE `posts`
ADD UNIQUE `unique_index`(`hotel_id`, `permalink`, `deleted_at`);
因此:如果hotel\u id
、permalink
和deleted\u at
字段(必须为空)的组合是唯一的,我就添加一个新行
如果已经有一行的permalink和hotel_id字段相同,且“deleted_at”字段为空,则验证将返回FALSE,并且该行不会插入数据库
嗯。我不知道为什么,但Laravel正在构建的查询如下所示:
SELECT count(*) AS AGGREGATE FROM `posts`
WHERE `hotel_id` = the-permalink-value AND `NULL` <> deleted_at)
有人能解释一下这是如何有效地工作的吗?因为我看到的每个地方都是这样的:
$rules = array(
'field_to_validate' =>
'unique:table_name,field,anotherField,aFieldDifferentThanNull,NULL',
);
有人能帮我吗
谢谢大家
最后,我对验证有了正确的理解(至少,我认为是这样),我有了一个解决方案,如果它不漂亮,它可以帮助别人
正如我之前所说,我的问题是,只有当其他列的值具有某些特定值时,才验证某个列(permalink)是否唯一。问题在于Laravel验证字符串规则的工作方式。让我们开始吧:
首先我写了这样一段话:
“永久链接”=>“必需|唯一:帖子、永久链接、酒店id、删除地址、空|字母破折号|最大值:255”
它产生了错误的查询。现在看看这个:
'column_to_validate' => 'unique:table_name,column_to_validate,id_to_ignore,other_column,value,other_column_2,value_2,other_column_N,value_N',
所以。唯一字符串首先有3个参数:
1) 验证的表名
2) 要验证唯一值的列的名称
3) 要避免的列的ID(在编辑行而不是创建新行的情况下)
在这一点之后,您所要做的就是将其他列按顺序排列,如“key,value”,以便在您的唯一规则中使用
哦,简单,安?别那么快,爪子。如果您使用的是静态数组,您将如何避免使用“当前”ID?因为Laravel模型中的$rules数组是一个静态数组。所以,我必须想出一个办法:
public static function getPermalinkValidationStr() {
$all = Input::all();
# If you are just building the frozenNode page, just a simple validation string to the permalink field:
if(!array_key_exists('hotel', $all)) {
return 'required|alpha_dash|max:255';
}
/* Now the game got real: are you saving a new record or editing a field?
If it is new, use 'NULL', otherwise, use the current id to edit a row.
*/
$hasId = isset($all['id']) ? $all['id'] : 'NULL';
# Also, check if the new record with the same permalink belongs to the same hotel and the 'deleted_at' field is NULL:
$result = 'required|alpha_dash|max:255|unique:posts,permalink,' . $hasId . ',id,hotel_id,' . $all['hotel'] . ',deleted_at,NULL';
return $result;
}
在FrozenNode规则配置中:
'rules' => array(
'hotel_id' => 'required',
'permalink' => Post::getPermalinkValidationStr()
),
嗯。我不知道是否有最简单的方法(或者更好的方法)。如果你知道这个解决方案有问题,请发表评论,我很高兴听到更好的解决方案。我已经尝试了Ardent和Observer,但我在FrozenNode管理员方面遇到了一些问题
谢谢。听起来您正试图以非常简单的格式进行非常复杂的验证。规则应该非常简单。如果您想要更复杂、更具体的东西,您可以创建自己的验证器回调。在
Validator
类中,添加一个函数validateSuperUnique
,并将其用作'superunique'
。您能否链接unique
规则定义的参考,该规则解释如何使用后续字段值对进行唯一性检查?
'rules' => array(
'hotel_id' => 'required',
'permalink' => Post::getPermalinkValidationStr()
),