0

我是 cakephp 的菜鸟,在使用此验证规则时,我很不幸得到了令人满意的响应。在我的项目中,我必须验证名称 wrt 外键和许多其他属性,例如 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.namewrt的唯一性is_active=1t1_id=specific_value

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

任何帮助将不胜感激。

4

1 回答 1

2

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

软删除

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

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

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

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

软删除是个好主意吗?

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)));
}
于 2013-04-03T07:52:40.137 回答