Cakephp验证名称字段w.r.t同一表的其他字段的唯一性

时间:2013-04-03 06:50:51

标签: php validation cakephp

我是cakephp中的一种菜鸟,在使用此验证规则时,我不幸得到满意的答复。 在我的项目中,我必须使用名称w.r.t外键和许多其他属性如is_active 让我们说

Table t1 has attributes (id, name varchar, is_active Boolean)

table t2 has attribute (id, name varchar, t1_id (foreign key to table t1), is_active boolean)

现在,我想验证t1

的表is_active的唯一名称

验证t2.name w.r.t is_active=1t1_id=specific_value

的唯一性

我用谷歌搜索并发现了一个关于此的链接,没有运气:( http://www.dereuromark.de/2011/10/07/maximum-power-for-your-validation-rules/

真的很感激任何帮助。

1 个答案:

答案 0 :(得分:1)

首先可能值得考虑的一些建议;

软删除

显然,您正在尝试在您的网站中实施“软删除”。如果您想要删除某些内容,但有时可以删除软删除,但能够在以后阶段'取消删除'它。

但是,通过允许活动非活动项共享相同的名称,'name'不再是唯一的(根据您的问题,唯一名称是必需的)。

这会阻止您取消删除项目,因为此时数据库中存在两个具有相同名称的项目,两者都处于活动状态。

以下是关于“软删除”主题的一些讨论;

Are soft deletes a good idea?

http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/

修订/历史

如果您尝试实施“修订历史记录”,而不是“软删除”,则最好将修订版存储在单独的表中。已经有一些CakePHP插件可以为您处理。我没有链接到他们,但你可以通过谷歌来获取它。

自定义验证

回到你的问题;您可以通过在模型中创建自己的验证规则来检查“活动”组中的记录是否唯一,例如:

public function isNameUniqueActive()
{
    if (
        array_key_exists('is_active', $this->data[$this->alias])
        && 1 != $this->data[$this->alias]['is_active']
    ) {
        // Record to save is not 'active', so no need to check if it is unique
        return true;
    }

    $conditions = array(
        $this->alias . '.name'  => $this->data[$this->alias]['name'],
        $this->alias . '.is_active' => 1,
    );

    if ($this->id) {
        // Updating an existing record: don't count the record *itself*
        $conditions[] = array(
            'NOT' => array($this->alias . '.' . $this->primaryKey => $this->id)
        );
    }

    return (0 === $this->find('count', array('conditions' => $conditions)));
}

您将能够像内置验证规则一样使用此验证;

public $validate = array(
    'name' => 'isNameUniqueActive',
);

<强>更新

要同时检查名称在组中是否唯一(基于外键t1_id),请尝试以下操作:

public function isNameUniqueWithinGroup()
{
    if (
        array_key_exists('is_active', $this->data[$this->alias])
        && 1 != $this->data[$this->alias]['is_active']
    ) {
        // Record to save is not 'active', so no need to check if it is unique
        return true;
    }

    if (!array_key_exists('t1_id', $this->data[$this->alias])) {
        // No group specified - not valid?
        return false;
    }

    $conditions = array(
        $this->alias . '.name'  => $this->data[$this->alias]['name'],
        $this->alias . '.is_active' => 1,
        $this->alias . '.t1_id' => $this->data[$this->alias]['t1_id'],
    );

    if ($this->id) {
        // Updating an existing record: don't count the record *itself*
        $conditions[] = array(
            'NOT' => array($this->alias . '.' . $this->primaryKey => $this->id)
        );
    }

    return (0 === $this->find('count', array('conditions' => $conditions)));
}