doctrine2 - 使用自定义查询getter

时间:2011-09-09 13:18:06

标签: doctrine doctrine-orm symfony

我正在使用Symfony2和Doctrine2。我如何为get方法使用不同的查询? (措辞不好,让我解释一下)

即。我有一个应用程序实体,它与Version

有一对多的关系

所以在我的应用程序实体中我有:

/**
 * Get versions
 *
 * @return Doctrine\Common\Collections\Collection 
 */
public function getVersions()
{
    return $this->versions;
}

这一切都很好,但是,我如何实现一个方法,例如

getCurrentVersion,我执行一个简单的查询,例如:

SELECT v.* FROM version WHERE application_id = 1 AND current = 1

所以在树枝模板中,我可以这样做:

{% for application in applications %}
   Name : {{ application.name }}
   Current Version: {{ application.getCurrentVersion }}
{% endfor %}

非常感谢任何帮助。

P.S。如果我错了,请赐教。

感谢。

编辑:http://www.doctrine-project.org/docs/orm/2.1/en/reference/limitations-and-known-issues.html#join-columns-with-non-primary-keys说真的?!

编辑,我真的不想这样做,这是不必要的,而且非常浪费:

public function getCurrentVersion
{
   foreach($this->versions as $version)
   {
      if($version->current)
      {
        return $version;
      }

   }
}

2 个答案:

答案 0 :(得分:5)

答案 1 :(得分:2)

首先,您不应该从您的实体触摸数据库。将实体管理器注入管理实体被认为是不好的做法,否则无法知道数据层。

要执行您要求的操作,您可以使用带有getCurrentVersion方法的custom entity repository,该方法接受实体的id或实例并在其上运行查询:

// class Foo\Bundle\Repository\BarRepository
public function getCurrentVersion(MyClass $class)
{
    $dql = 'SELECT v FROM Namespace\Of\Version\Class v WHERE v.application_id=:id AND current=1';
    $query = $this->_em->createQuery($dql);
    $query->setParameter('id', $class->getId());
    $version = $query->execute();

    return $version;
}

请注意,如果您只想要一个版本,则可以使用$query->getSingleResult();代替$query->execute();

但是,听起来您正在尝试对某些课程进行版本控制/历史记录,在这种情况下,您应该查看Gedmo DoctrineExtensions和相关的Symfony2 bundle;具体来说,请查看Loggable行为扩展,它可以透明地处理实体的版本控制。