检查Model类中的重复值

时间:2011-01-11 02:32:26

标签: zend-framework zend-db

我有一个模型,Entity,我构建了一个EntityMapper和一个Entity类(我只是学习使用Zend Framework并遵循教程)。 Entity类有setName方法,我想要它做的是检查数据库中是否有另一个“实体”具有相同的名称,并且在这种情况下抛出异常或其他东西。

所以,如果我理解正确,DB调用应该只在Mapper类中。所以,在setName里面,我应该做些什么:

$entity = new Application_Model_EntityMapper();
if ($entity->checkDuplicateName($name, $this->_id))
  $this->_name = $name;
else
  throw new Exception(...);
return $this;

并将实际执行查询的代码放在Mapper类的新方法中? (当然,如果“实体”是新的,或者如果它已经有了id,那么查询应该是不同的,但这不是我的问题所在。)

我知道我可以通过几种方式实现这一目标,但我的目标是尽可能地调整框架的惯例。

2 个答案:

答案 0 :(得分:2)

由于保存是Mapperobject的职责,我会将验证添加到mapper类的保存例程中。 我不明白你们不同班级的职责是什么,所以我会解释一下:

- Application_Model_Entity是数据的纯结构,此类没有依赖关系
- Application_Model_EntityMapper拥有与dbrms交谈的权利,将改变记录中的实体,反之亦然。它“拥有”ActiveRecord(DbTable)类 - Application_Model_DbTable_Entity是ActiveRecord类,它从Zend_DbTable_Abstract扩展而来,能够对数据库进行查询,它只由Mapper使用。

$entity = new Application_Model_Entity();
$entity->setName('something which already exists');

$mapper = new Application_Model_EntityMapper();
$mapper->save($entity); // throws Exception

// works with: 
class Application_Model_EntityMapper
{
    /** @var Application_Model_DbTable_Entity */
    private $dbTable;

    ...

    public function save(Application_Model_Entity $entity)
    {
        $doValidation = ! $entity->getId(); // no id means not in db yet
        if ( $doValidation )
        {
            $hasDuplicatesValidator = new Zend_Validate_Db_RecordExists(
                'table' => 'entity',
                'field' => 'name'
            );
            $hasDuplicates = $hasDuplicatesValidator->isValid($entity->getName());
            if ( $hasDuplicates )
            {
                throw new Exception('There is already a record in the db with this name!');
            }
        }
        // go on and save
        $this->dbTable->save($entity);
    }
}

我希望代码解释自己。 这是我能找到的最“热情”的方式,希望这能帮助你走向zf社区:)

链接到manual for Zend_Validate_*

答案 1 :(得分:0)

我发现在setName进行检查会导致每次从db加载记录时运行查询(不好),所以我将调用移到了checkDuplicateName save 1}} Mapper类的方法。 (checkDuplicateName也在Mapper类上,现在作为私有方法)

我仍然想知道这是否是在Zend Framework中执行此类操作的标准方法。