使用映射器生成实体

时间:2013-01-18 17:40:13

标签: zend-framework2

我正在努力寻找产生恩赐的最佳方式,这就是我现在正在做的事情。

我通过这样的映射器和保湿器创建一个实体:

namespace Event\Model\Mapper;

use ZfcBase\Mapper\AbstractDbMapper;

class Event extends AbstractDbMapper
{
    protected $tableName  = 'events';

    public function findEventById($id)
    {
       $id = (int) $id;

       $select = $this->getSelect($this->tableName)
                      ->where(array('event_index' => $id));

       $eventEntity = $this->select($select)->current();  

     if($eventEntity){

        //Set Location Object
        $locationMapper = $this->getServiceLocator()->get('location_mapper');       
        $locationEntity = $locationMapper->findlocationById($eventEntity->getLocationIndex());          
        $eventEntity->setLocationIndex($locationEntity);

        //Set User Object
        $userMapper = $this->getServiceLocator()->get('user_mapper');
        $userEntity = $userMapper->findUserById($eventEntity->getEnteredBy());
        $eventEntity->setEnteredBy($userEntity);

        //Set Catalog Object
        $catalogMapper = $this->getServiceLocator()->get('catalog_mapper');
        $catalogEntity = $catalogMapper->findCatalogById($eventEntity->getCatalogIndex());
        $eventEntity->setCatalogIndex($catalogEntity);          
    }


    return $eventEntity;
   }
}

现在这种方法的问题在于,当我打电话让我们说用户实体时,这个实体有其他实体附加到它,所以当我通过插入用户实体生成Event实体时,我的Event实体变得非常庞大和笨重,我不我希望我只想要“老年学树”的第一层。

所以我正在考虑创建一个EventEntityFactory,我可以将Event enity的子实体绑定在一起,我打算为此做一个工厂。

有更好的方法吗?

由于

1 个答案:

答案 0 :(得分:1)

一种方法是使用虚拟代理(延迟加载):

http://phpmaster.com/intro-to-virtual-proxies-1/

http://phpmaster.com/intro-to-virtual-proxies-2/

基本上,您将生成实体,并使用轻量级代理对象替换任何相关实体。此对象仅在需要时通过延迟加载加载相关实体。

我已经多次使用这种方法和Datamapper设计模式,并且效果非常好。