0

我一直在关注http://framework.zend.com/manual/2.1/en/modules/zend.form.collections.html,它在验证等方面效果很好。

当表单有效时,指南只会在实体上运行var_dump,它看起来像这样:

object(Application\Entity\Product)[622]
  protected 'name' => string 'Chair' (length=5)
  protected 'price' => string '25' (length=2)
  protected 'categories' =>
    array (size=2)
      0 =>
        object(Application\Entity\Category)[615]
          protected 'name' => string 'Armchair' (length=8)
      1 =>
        object(App1ication\Entity\Category)[621]
          protected 'name' => string 'Office' (length=6)

类别可以多于 2 个或仅 1 个。如何将普通表单保存到我理解的数据库表中并且没有问题。但是这里我们有两个不同表的数据。我想我可以手动读取控制器中的类别并将它们填充到模型中并逐行保存它们。但这感觉不是最好的方法。

如何将数据从实体获取到模型或我的数据库?没有教义可以做到吗?

4

1 回答 1

1

您有两个选择:getData()bind()

bind()是“自动”方式 - 您将实体绑定到表单对象,该对象在该实体上具有与您的集合名称匹配的属性。然后,当isValid()调用表单的方法时,绑定机制会将集合元素中的值传递给实体上的匹配属性。

或者,您可以getData()在集合对象上使用,然后执行您需要的任何操作。

拥有实体后,要保存它,请考虑使用ZfcBase,因为它为您完成了艰苦的工作。

这是一个简单的示例映射器:

namespace MyModule\Mapper;

use ZfcBase\Mapper\AbstractDbMapper;
use Zend\Stdlib\Hydrator\ArraySerializable;
use MyModule\Entity\MyEntity;

class MyMapper extends AbstractDbMapper
{
    protected $tableName  = 'my_table';

    public function __construct()
    {
        $this->setHydrator(new ArraySerializable());
        $this->setEntityPrototype(new MyEntity());
    }

    public function save(MyEntity $entity)
    {
        if (!$entity->getId()) {
            $result = $this->insert($entity);
            $entity->setId($result->getGeneratedValue());
        } else {
            $where = 'id = ' . (int)$entity->getId();
            $this->update($entity, $where);
        }
    }

    public function fetchAll($choiceGroupId)
    {
        $select = $this->getSelect($this->tableName);
        return $this->select($select);
    }

    public function loadById($id)
    {
        $select = $this->getSelect($this->tableName)
                       ->where(array('id' => (int)$id));

        return $this->select($select)->current();
    }        
}

此映射器正在使用ArraySerializablehydrator,因此您的实体对象(MyEntity在示例中)必须实现方法getArrayCopy()populate(). getArrayCopy()返回要保存populate()的数据数组,用于从数据库的数据数组中填充实体。

于 2013-02-19T08:15:32.063 回答