Kohana 3.3 ORM验证 - 当值为空时,唯一值不起作用

时间:2014-03-04 12:44:14

标签: kohana kohana-3 kohana-orm kohana-3.3

在Model_Page类中,扩展Kohana ORM类,我有这个规则定义:

public function rules() {
    return array(
        'url' => array(
            array('Model_Page::unique_url', array($this)),
        ),
    );
}

为了简化这里,我将从此函数返回false,因此在我尝试保存/更新页面时它永远不会验证:

public static function unique_url($page) {
  return false;
}

这可以正常工作,如果 url的值是 not NULL 不是空字符串

但是如果我已经有一个带有空url的页面,并且我尝试添加一个带有空url的新页面,那么即使强制返回false,也会忽略unique_url函数。

这可能是一个错误,但也许我错过了什么......?在Kohana文档中,对于唯一的示例,他们使用用户名作为示例,但用户名也有一个not_empty规则,这里不适用。

任何帮助/建议表示赞赏!

1 个答案:

答案 0 :(得分:0)

我相信规则会在您设置值后应用,而不是在您保存时应用。

我遇到了类似的问题 - 如果我没有为该字段分配任何值,则过滤器无效。我写了自己的保存方法:

public function save(Validation $validation = NULL)
{
    if (!$this->loaded())
    {
        $this->ordering = 0;
    }

    return parent::save($validation);
}

这样,总是会为新创建的对象分配排序,我的过滤器也可以工作。

这就是我建造另一个模型的方式。这是一个拥有独特公司名称的公司模型。该字段的规则定义如下:

'name' => array(
    array('not_empty'),
    array('max_length', array(':value', 255)),
    array(array($this, 'unique_name'))
)

我有一个方法:

public function unique_name($value)
{
    $exists = (bool) DB::select(array(DB::expr('COUNT(*)'), 'total_count'))
        ->from($this->_table_name)
        ->where('name', '=', $value)
        ->where($this->_primary_key, '!=', $this->pk())
        ->execute($this->_db)
        ->get('total_count');

    return !$exists;
}

它基本上检查是否有任何其他公司与当前公司同名。也许这会让您了解解决方案可能出现的问题。