保存表单集合中的数据

时间:2013-02-18 22:07:00

标签: zend-form zend-framework2 zend-db

我一直关注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.如何将普通表单保存到数据库表我理解并且没有问题。但是在这里我们有两个不同表格的数据。我想我可以手动读取控制器中的类别并将它们填入模型并逐行保存。但这并不是最好的方式。

如何从实体获取数据到模型或数据库?可以在没有Doctrine的情况下完成吗?

1 个答案:

答案 0 :(得分: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();
    }        
}

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