2013-04-05 95 views
0

嗨大家我使用原则ODM和hydator有问题。我不能使用嵌入集合或参考类对文档进行摘录。这些类的提取结果给我的对象,我真的需要让他们在数组中休息模块,这是由骨干实施消耗。 这里一个例子类: Analyse.php文档zf2 doctrine odm收集水合

<?php 
namespace Application\Document; 

use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM; 
use Doctrine\Common\Collections\Collection; 

/** 
* Application\Document\Analyse 
* 
* @ODM\Document(collection="analyse") 
*/ 
class Analyse extends BaseDocument 
{ 
    /** 
    * @ODM\Id 
    */ 
    protected $id; 

    /** 
    * @ODM\Field(type="string") 
    */ 
    protected $nom; 

    /** 
    * @ODM\Field(type="string") 
    * @ODM\Index 
    */ 
    protected $alias; 

    /** 
    * @ODM\EmbedMany(targetDocument="ElementsAnalyse") 
    */ 
    protected $elements = array(); 

    public function __construct() 
    { 
     parent::__construct(); 
     $this->elements = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    public function getId() 
    { 
     return $this->id; 
    } 

    public function setNom($nom) 
    { 
     $this->nom = $nom; 
     return $this; 
    } 

    public function getNom() 
    { 
     return $this->nom; 
    } 

    public function setAlias($alias) 
    { 
     $this->alias = $alias; 
     return $this; 
    } 

    public function getAlias() 
    { 
     return $this->alias; 
    } 

    public function addElements(Collection $elements) 
    { 
     foreach ($elements as $element) { 
      $this->elements->add($element); 
     } 

    } 

    public function removeElements(Collection $elements) 
    { 
     foreach ($elements as $item) { 
      $this->elements->removeElement($item); 
     } 
    } 

    public function getElements() 
    { 
     return $this->elements; 
    } 

} 

ElementAnalyse.php收集

<?php 

namespace Application\Document; 

use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM; 
use Doctrine\Common\Collections\Collection; 

/** 
* Application\Document\Valeurnormales 
* 
* @ODM\EmbeddedDocument 
* 
*/ 
class ElementsAnalyse 
{ 

    /** 
    * @ODM\Field(type="string") 
    */ 
    protected $nom; 

    /** 
    * @ODM\Field(type="string") 
    */ 
    protected $unite; 

    /** 
    * @ODM\EmbedMany(targetDocument="ValeurNormales") 
    */ 
    protected $valeurnormales = array(); 

    /** 
    * @ODM\Field(type="string") 
    */ 
    protected $type; 


    public function __construct() 
    { 
     $this->valeurnormales = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    /** 
    * Set nom 
    */ 
    public function setNom($nom) 
    { 
     $this->nom = $nom; 
     return $this; 
    } 

    /** 
    * Get nom 
    */ 
    public function getNom() 
    { 
     return $this->nom; 
    } 

    /** 
    * Set unite 
    */ 
    public function setUnite($unite) 
    { 
     $this->unite = $unite; 
     return $this; 
    } 

    /** 
    * Get unite 
    * 
    * @return string 
    */ 
    public function getUnite() 
    { 
     return $this->unite; 
    } 

    /** 
    * add valeurnormales 
    */ 
    public function addValeurnormales(Collection $vn) 
    { 
     foreach ($vn as $item) { 
      $this->valeurnormales->add($item); 
     } 
    } 

    public function removeValeurnormales(Collection $vn) 
    { 
     foreach ($vn as $item) { 
      $this->valeurnormales->removeElement($item); 
     } 
    } 

    /** 
    * Get valeurnormales 
    */ 
    public function getValeurnormales() 
    { 
     return $this->valeurnormales; 
    } 

    /** 
    * Set type 
    * 
    * @param $type 
    * @return Analyse 
    */ 
    public function setType($type) 
    { 
     $this->type = $type; 
     return $this; 
    } 

    /** 
    * Get type 
    * 
    * @return Type 
    */ 
    public function getType() 
    { 
     return $this->type; 
    } 

    /** 
    * toArray function 
    */ 
    public function toArray() 
    { 
     return get_object_vars($this); 
    } 

    /** 
    * fromArray function 
    * 
    */ 
    public function fromArray(array $array) 
    { 
     $objects = $this->toArray(); 
     foreach($array as $item => $value) 
     { 
      if(array_key_exists($item, $objects)) 
      { 
       $this->$item = $value; 
      } 
     } 
    } 

} 

这里我的GetList方法

public function getList() 
    { 
     $hydrator = new DoctrineHydrator($entityManager, 'Application\Document\Analyse'); 

     $service = $this->getAnalyseService(); 
     $results = $service->findAll(); 

     $data = $hydrator->extract($results); 
     return new JsonModel($data); 
    } 

而且很明显的var_dump($数据[ '元素' ])返回对象集合或代理类 你能帮助我吗?任何东西将不胜感激它已经2个星期,我不能让它工作。 阅读Hydrator Strategy,但我不知道如何实现它。

回答

0

目前,Doctrine ODM实现不提供嵌入对象和引用的递归。

如果在$hydrator->extract($results)上使用var_dump(),则会看到所有嵌入/引用都以其原始对象格式存在。

你可以在这里做的是使用Zend\Stdlib\Hydrator\Strategy,并定义你自己的提取/水合的逻辑。 Doctrine扩展了Zend Framework 2的水化器和策略。

+1

OP询问有关如何实施Hydrator策略(无论是什么)的建议,如果您知道如何实施Hydrator策略,您是否可以分享一个快速示例? – 2014-03-31 00:14:22