Symfony2:如何在相关实体上创建自定义查询方法

时间:2014-08-17 18:35:55

标签: symfony doctrine-orm

我有User个实体ArrayCollection Positions。每个Position都有user_id属性。

现在我想从一个用户获得所有positions(以获得所有我会做的$user->getPositions())与特定查询匹配,例如具有与当前日期匹配的日期属性。因此我想做$user->getCurrentPositions()之类的事情,它应该返回与该用户相关的位置的子集。

这怎么可能?

编辑:

我真正想做的是在我的控制器中这样的事情:

$em = $this->getDoctrine()->getManager();
$users = $em->getRepository('fabianbartschWhereMyNomadsAtBundle:User')->findAll();

foreach ($users as $user) {
  $positions =  $user->getCurrentPositions();

  foreach ($positions as $position) {
    echo $position->getLatitude().'<br>';
  }
}

我想迭代所有用户和每个想要拥有相关职位的用户。但是我认为这不可能来自存储库,因为我收到以下消息:Attempted to call method "getCurrentPositions" on class ...

2 个答案:

答案 0 :(得分:2)

如果您使用的是Doctrine,则可以使用内置的Criteria API,该API专门用于此目的。

集合有一个过滤API,允许您从集合中分割部分数据。如果尚未从数据库加载集合,则过滤API可以在SQL级别上工作,以便对大型集合进行优化访问。

查看链接: http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-associations.html#filtering-collections

答案 1 :(得分:0)

好的,我发现了,确实可以使用存储库:

实体\ user.php的

/**
 * @ORM\Entity(repositoryClass="fabianbartsch\WhereMyNomadsAtBundle\Entity\UserRepository")
 * @ORM\Table(name="fos_user")
 */
 class User extends BaseUser
 {

实体\ UserRepository.php

/**
 * UserRepository
 */
class UserRepository extends EntityRepository
{
    public function getCurrentPositions()
    {
        $query = $this->getEntityManager()
            ->createQuery(
                "SELECT p
                 FROM xxx:Position p
                 WHERE p.start <= '2014-08-17' AND p.end >= '2014-08-17'"
            );

        try {
            return $query->getResult();
        } catch (\Doctrine\ORM\NoResultException $e) {
            return null;
        }
    }
}

在用户对象中,只有相关位置条目受查询影响,因此无需将用户实体与位置实体连接。非常简单,应该尝试在stackoverflow上发帖,sry guys:P