サーチ…


新しいリポジトリの作成

必要な場所に新しいリポジトリを作成できますが、別のRepositoryフォルダにRepositoryを作成することをお勧めします。

リポジトリファイルとクラスの名前はEntityNameRepositoryですが、リポジトリのEntityNameRepositoryに名前を付けて、フォルダ内にあるものをすばやく見つけることができます。

AppBundle\Entity保存されているProjectエンティティがあると仮定しましょう。

<?php
    
namespace AppBundle\Entity;
    
use Doctrine\ORM\Mapping as ORM;

/**
 * Project Entity - some information 
 *
 * @ORM\Table(name="project")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\ProjectRepository")
 */
class Project
{
   // definition of the entity with attributes, getters, setter whatsoever
}
    
?>

ここで重要な部分は、 @ORM\Entity(repositoryClass="AppBundle\Repository\ProjectRepository")という行です。これは、このEntityを指定されたRepositoryクラスに接続するためです。

また、マッピングオプションを使用するには、 \Doctrine\ORM\Mappingクラスを使用する必要があります。

リポジトリ自体はかなりシンプルです

<?php

namespace AppBundle\Repository;

class ProjectRepository extends \Doctrine\ORM\EntityRepository
{
    public function getLastTenProjects()
    {
        // creates a QueryBuilder instance
        $qb = $this->_em->createQueryBuilder()
            ->select('p')
            ->from($this->_entityName, 'p')
            ->orderBy('p.id', 'DESC')
            ->setMaxResults(10)
        ;
        // uses the build query and gets the data from the Database
        return $qb->getQuery()->getResult();
    }
}

?>

リポジトリクラスは、 \Doctrine\ORM\EntityRepository拡張して正しく動作できることに注意することが重要です。これで、さまざまなクエリーに必要な数の関数を追加できます。

ExpressionBuilderのIN()関数

QueryBuilderでMySQLコマンドIN()を使用する場合は、 ExpressionBuilderクラスのin()関数を使用してIN()コマンドを実行できます。

// get an ExpressionBuilder instance, so that you
$expressionBulder = $this->_em->getExpressionBuilder();
$qb = $this->_em->createQueryBuilder()
->select('p')
->from($this->_entityName, 'p');
->where($expressionBuilder->in('p.id', array(1,2,3,4,5)));

return $qb->getQuery()->getResult();

サブクエリでクエリを作成する

たとえば、select文の中でサブクエリselect文を使用する方法を示すには、まだアドレスをコンパイルしていないすべてのユーザを検索するとします(レコードはアドレステーブルに存在しません)。

 // get an ExpressionBuilder instance, so that you
$expr = $this->_em->getExpressionBuilder();

// create a subquery in order to take all address records for a specified user id
$sub = $this->_em->createQueryBuilder()
    ->select('a')
    ->from($this->_addressEntityName, 'a')
    ->where('a.user = u.id');


$qb = $this->_em->createQueryBuilder()
    ->select('u')
    ->from($this->_userEntityName, 'u')
    ->where($expr->not($expr->exists($sub->getDQL())));

return $qb->getQuery()->getResult();


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow