Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation Laravel验证:具有多列和软删除功能_Validation_Laravel_Laravel 4 - Fatal编程技术网

Validation 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

我正在尝试执行以下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 `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()
  ),