2013-02-18 108 views
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.如何保存正常形式到一個數據庫表我明白,並沒有問題。但是在這裏我們有兩個不同表格的數據。我想我可以手動讀取控制器中的類別,並將它們填充到模型中並逐行保存。但是,這並不是做這件事的最好方式。

如何從實體獲取數據到模型或數據庫?沒有教義可以做到嗎?

回答

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()填充來自數據庫數據數組的實體。

+0

是從實體獲取數據到表單工作得很好,另一種方式。在驗證完成之後,指南以「var_dump($ product);」結尾,我用數據坐在實體上,但我不知道如何製作水化器和映射器。 – Rickard 2013-02-19 11:50:06

+0

啊哈!更新回答,以包含關於mappers的一些信息 – 2013-02-19 13:48:41

+0

感謝您將時間投入到這個Rob!我認爲我的問題仍然不清楚:)我現在已經更新了一些內容,希望能夠更清楚地表明我不明白的地方。 – Rickard 2013-02-19 22:26:18