2013-02-18 4 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을 사용하는 것이 좋습니다. 당신의 엔티티 객체 (예 MyEntity)이 방법 getArrayCopy()populate()를 구현해야하므로,

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 하이드 레이터를 사용하고 있습니다 :

이 간단한 예를 들어 매퍼이다. getArrayCopy()은 저장할 데이터 배열을 반환하고 populate()은 데이터베이스의 데이터 배열에서 엔터티를 채우는 데 사용됩니다.

+0

예 엔티티에서 양식으로 데이터를 가져 오는 것이 매우 잘 작동하고 다른 방법은 작동합니다. 유효성 검사가 끝나면 가이드가 "var_dump ($ product);"로 끝납니다. 데이터가있는 엔티티에 앉아 있지만 hydrator와 매퍼를 만드는 방법을 모르겠습니다. – Rickard

+0

아하! 업데이트 된 답변으로 매퍼에 대한 정보가 포함되었습니다. –

+0

Rob에 시간을내어 주셔서 감사합니다! 나는 아직도 내 질문에 불분명하다고 생각한다. 나는 그것을 얼마간 업데이트했고, 내가 이해하지 못하는 것에 더 분명하게 희망한다. – Rickard

관련 문제