如何从Doctrine Entity Repository访问Doctrine Document Manager

时间:2014-06-18 08:29:42

标签: symfony doctrine-orm doctrine-odm

我有一个doctrine实体User和一个文档Address(存储在mongoDB中)。我想通过userId属性设置它们之间的一对多关系。 (用户有很多地址)

我的用户实体:

namespace BlaBla\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;


/**
 * @var integer
 */
private $id;

/**
 * @var string
 */
private $firstName;

......等等

我的地址文件:

namespace BlaBla\UserBundle\Document;
/**
 * BlaBla\UserBundle\Document\Address
 */
class Address
{
/**
 * @var MongoId $id
 */
protected $id;

/**
 * @var string $firstName
 */
protected $firstName;

/**
 * @var string $lastName
 */
protected $lastName;

/**
 * @var int $userId
 */
protected $userId;

......等等

我的目标是为Address对象创建getUser()方法,为User对象创建getAddresses()方法。

我决定将方法getAddresses()放到doctrine UserRepository类中,并在那里注入必要的文档管理器,以便能够访问Address Document。我已经覆盖了userRepository的构造函数,并将必要的文档管理器对象传递给它。

请查看UserRepository类:

<?php

namespace BlaBla\UserBundle\Repository;

use Doctrine\ORM\EntityRepository;

class UserRepository extends EntityRepository
{
/**
 * @var \Doctrine\ODM\MongoDB\DocumentManager
 */
private $_dm;

/**
 * @param \Doctrine\ORM\EntityManager $dm
 */
public function __construct(\Doctrine\ORM\EntityManager $em, $dm) {

    $metaData = new \Doctrine\ORM\Mapping\ClassMetadata('BlaBla\UserBundle\Entity\User');
    parent::__construct($em, $metaData);
    $this->_dm = $dm;
}

/**
 * @param $user_id integer
 * @return \BlaBla\UserBundle\Document\Address
 */
public function getAddress($user_id) {
    $address = $this->_dm->getRepository('BlaBlaUserBundle:Address');
    $rt = $address->findByUserId($user_id);
    return $rt;
}

public function getAllUsers()
{
    return $this->findAll();
}
}

在此之后,我可以通过以下方式从我的控制器访问存储库:

    $em = $this->getDoctrine()->getManager();
    $dm = $this->get('doctrine_mongodb')->getManager();
    $t = new \BlaBla\UserBundle\Repository\UserRepository($em, $dm);
    var_dump($t->getAddress($id));
    var_dump($t->getAllUsers());

这两种方法都运行得很好,但现在我无法使用以下快捷方式访问存储库:

 $user = $this->getDoctrine()->getRepository('BlaBlaUserBundle:User');

我想过用这样的东西把Repository作为服务:

user.repository:
   class: BlaBla\UserBundle\Repository\UserRepository
   arguments: [@doctrine.orm.entity_manager, @doctrine.odm.mongo_db.document_manager]

在我的services.yml文件中,但这只允许我使用以下命令访问存储库:

$this->get('user.repository'); 

默认快捷方式仍无效。

请帮助找到解决此问题的正确方法。

感谢。

1 个答案:

答案 0 :(得分:0)

您在哪里指定了UserRepository?在带有注释的User.php中?也许这是唯一缺少的东西。 但是如果你想使用实体和文档存储库,我建议你使用Doctrine扩展,特别是Reference