サーチ…
新しいリポジトリの作成
必要な場所に新しいリポジトリを作成できますが、別の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