16

Doctrine2 の名前付きクエリに関するドキュメントが見つかりません。助けてください。Doctrine2 には名前付きクエリ機能がありますか?

4

4 に答える 4

25

使用できます

  1. NamedQuery - DQL。例

    use Doctrine\ORM\Mapping\NamedQuery;
    use Doctrine\ORM\Mapping\NamedQueries;
    
    /**
    * @Entity
    * @Table(name="cms_users")
    * @NamedQueries({
    *     @NamedQuery(name="activated", query="SELECT u FROM __CLASS__ u WHERE u.status = 1")
    * })
    */
    class CmsUser
    {}
    

    そして、それを次のように呼び出します

    $this->getDoctrine()->getRepository('MyBundle:CmsUser')
        ->createNamedQuery('activated')
        ->getResult();
    
  2. NamedNativeQuery - SQL。詳細はこちら: http://docs.doctrine-project.org/en/latest/reference/native-sql.html#named-native-query

  3. 次のように、EntityRepository でクエリを収集します。

    namespace Acme\StoreBundle\Repository;
    
    use Doctrine\ORM\EntityRepository;
    
    class ProductRepository extends EntityRepository
    {
        public function findAllOrderedByName()
        {
            return $this->getEntityManager()
                ->createQuery('SELECT p FROM AcmeStoreBundle:Product p ORDER BY p.name ASC')
                ->getResult();
        }
    }
    

    詳細はこちら: http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes

同様のトピックはこちら: https://groups.google.com/forum/?fromgroups#!topic/doctrine-user/K-D5ta5tZ3Y[1-25]

于 2014-05-15T14:15:09.377 に答える
2

おそらく、複雑な Doctrine クエリを作成して保存し、必要な場所でプロジェクト内のテーマを呼び出すことができる EntityRepositories に興味があるでしょう:

http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes

于 2012-08-18T07:30:46.537 に答える
0

ネイティブの名前付きクエリの例を探しているこの質問を見つけました。上記の回答が役に立ったので、同じ方法でネイティブの名前付きクエリを実行する方法を共有すると思いました。

これをエンティティ リポジトリのコンストラクタに追加します。

public function __construct($em, \Doctrine\ORM\Mapping\ClassMetadata $class)
{
    parent::__construct($em, $class);
    $this->getClassMetadata()->addNamedNativeQuery(
        array('name' => 'published', 
              'query' => 'SELECT 
                  t0.id AS id, 
                  t0.tracking_uri AS tracking_uri, 
                  t0.name AS name, 
                  t0.description AS description, 
                  t0.url_name AS url_name,
                  t0.status_type_id as status_type_id
                FROM 
                  store.store t0 
                WHERE 
                  t0.status_type_id = 2', 
               'resultClass' => '__CLASS__',
               'resultSetMapping' => array('entities' => array('entityClass' => '__CLASS__',
                                                               'fields'      => array('id'           => 'id',
                                                                                      'tracking_url' => 'tracking_url',
                                                                                      'name'         => 'name',
                                                                                      'description'  => 'description',
                                                                                      'url_name'     => 'url_name',
                                                                                      'status_type'  => 'status_type_id')))));
}

これが私のテストのクリップです

public function testNamedNativeQueryPublished()
{
    $results = $this->em->getRepository('MyBundle:Store')->createNativeNamedQuery('published')->execute();

    foreach ($results as $store)
    {
        $this->assertEquals(2, $store->getStatusType());
    }
}
于 2016-06-09T01:51:02.527 に答える
0

エンティティ定義を台無しにしたくない場合は、リポジトリのコンストラクターで注釈表記によって内部的に使用される関数を呼び出すことができます。

namespace MyBundle\Repository;

use Doctrine\ORM\EntityRepository;

class CmsUserRepository extends EntityRepository
{
    public function __construct($em, \Doctrine\ORM\Mapping\ClassMetadata $class)
    {
        $this->getClassMetadata()->addNamedQuery(array(
            'name'  => 'activated',
            'query' => 'SELECT u FROM __CLASS__ u WHERE u.status = 1'
        ));
    }
}

__CLASS__ステートメントの一部をエンティティの名前空間とクラスに置き換えることもできますMyBundle\Entity\CmsUser

于 2014-02-25T18:03:06.853 に答える