【问题标题】:doctrine2 - use custom query getter学说2 - 使用自定义查询getter
【发布时间】:2011-09-09 13:18:06
【问题描述】:

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

即我有一个应用程序实体,它与版本有一对多的关系

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

/**
 * 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 %}

非常感谢任何帮助。

附言如果我说错了,请赐教。

谢谢。

编辑: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;
      }

   }
}

【问题讨论】:

    标签: doctrine doctrine-orm symfony


    【解决方案1】:
    【解决方案2】:

    首先,您不应该从您的实体中接触数据库。将实体管理器注入托管实体被认为是不好的做法,否则它无法了解数据层。

    要执行您的要求,您可以使用 custom entity repository 和 getCurrentVersion 方法,该方法采用实体的 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 行为扩展,它透明地处理实体的版本控制。

    【讨论】:

    • 您好,我没有尝试进行任何版本控制。这只是我正在使用的一个简单的布尔字段,我也可以有 getLatestFiveVersions 等。我知道可以这样做,但我如何在我的 twig 模板中使用实体存储库方法,例如 application.getCurrentVersion?感谢您的帮助:-) 这是最大的问题......
    猜你喜欢
    • 2013-01-18
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多