2011-09-09 7 views
2

私はSymfony2とDoctrine2を使用しています。どうやってgetメソッドのために別のクエリを使うのでしょうか?doctrine2 - カスタムクエリゲッターを使用

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

これがすべてです:私は、アプリケーションの実体を持っている。すなわち、これは私が持っている自分のアプリケーションの実体にバージョン

と多くの関係に1をしてい

(悪い言葉遣い、私が説明しましょう)良い、しかし、私は私のような、単純なクエリを実行する方法、など

getCurrentVersion、実装する方法:

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

ので、小枝テンプレートで、私が行うことができます。すべてのヘルプははるかに高く評価されて

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

p.s.私がこの間違ったことをするなら、私を教えてください。

ありがとうございました。

EDIT:http://www.doctrine-project.org/docs/orm/2.1/en/reference/limitations-and-known-issues.html#join-columns-with-non-primary-keys真剣に!

EDITは、私は本当にこれを行うにはしたくない、それは不必要とresourcefully無駄です:

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

    } 
} 

答えて

2

まず、あなたはあなたのエンティティからデータベースには触れてはいけません。エンティティマネージャを管理対象エンティティに挿入するのは悪い習慣と考えられ、それ以外の場合はデータレイヤについて知る方法がありません。

あなたが求めているものを行うには、あなたは、エンティティのIDまたはインスタンスを取り、それにクエリを実行getCurrentVersion方法でcustom entity repositoryを使用することができますが:

// 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; 
} 

注意あなたがしている場合は、その; 1つのバージョンだけを期待して、あなたが、その場合には、あなたがGedmo DoctrineExtensionsと関連Symfony2 bundleをチェックアウトする必要があり、あなたのクラスの一部にバージョニング/歴史をやろうとしているようしかし、それが聞こえる代わりに$query->execute();

$query->getSingleResult();を使用することができます具体的には、エンティティのバージョン管理を透過的に処理するLoggableビヘイビア拡張を見てください。

+0

こんにちは、私はバージョン管理をしていません。それは私が使用している単なるブール値のフィールドですが、私はgetLatestFiveVersionsなども持つことができます。私はこれを行うことができると知っていますが、私はapplication.getCurrentVersionのようなテンプレートでエンティティリポジトリメソッドを使用できますか?助けてくれてありがとう:-)これは最大の問題です...... – Flukey