我想创建自己的方法findBy()
。我有两个实体:Film
和Genre
。此自定义findBy()
方法的目的是:
- 将
Film
实体与Genre
实体联接,以检索我的所有影片以及相关的流派, - 保持基本方法的参数为:
$criteria
,$orderBy
,$limit
和$offset
。
实际上,我使用这些参数进行分页。
以前我做了一个自定义的findAll方法,其中包含两个实体之间的连接:
<?php
public function myFindAll()
{
$films = $this->createQueryBuilder('f')
// leftJoin because I need all the genre
->leftJoin('f.genres', 'g')
->addSelect('g.label')
->groupBy('f.id')
->getQuery()
->getArrayResult();
// $genres contains all the genres and the associated movies
return ($films);
}
我不知道如何包含其余参数。
slice(( 怎么样?
$genders = $em->getRepository('modelsGender')->findAll()->slice($offset, $lenght);
此外,您可以使用您的函数,例如:
public function myFindAll($criteria, $orderBy, $limit, $offset)
{
$films = $this->createQueryBuilder('f')
// leftJoin because I need all the genre
->leftJoin('f.genres', 'g')
->addSelect('g.label')
->groupBy('f.id')
->add('orderBy', "f.{$orderBy} ASC")
->getQuery()
->getArrayResult()
->slice($offset, $limit);
// $films contains all the genres and the associated movies
return ($films);
}
编辑:
slice()
函数充当分页函数:
$page1 = $films->slice(0, 15); // retrieve films from 0 to 15 position
$page2 = $films->slice(10, 7); // retrieve films from 10 to 17 position
现在,如果你想使用一些条件值,你可以做这样的东西:
public function myFindAll($criteria, $orderBy, $limit, $offset)
{
$films = $this->createQueryBuilder('f');
foreach($criteria as $column => $value)
$films->where($column, $value);
$films
->leftJoin('f.genres', 'g')
->addSelect('g.label')
->groupBy('f.id')
->add('orderBy', "{$orderBy[0]} {$orderBy[1]}");
->getQuery()
->getArrayResult()
->slice($offset, $limit);
// $genres contains all the genres and the associated movies
return ($films);
}
我不确定where
函数是否会覆盖以前的条件,但至少它可以引导您找到正确的查询
setFirstResult(( 和 setMaxResult((
此外,您还可以使用另一个选项:
public function myFindAll($criteria, $orderBy, $limit, $offset)
{
$films = $this->createQueryBuilder('f');
foreach($criteria as $column => $value)
$films->where($column, $value);
$films
->leftJoin('f.genres', 'g')
->addSelect('g.label')
->groupBy('f.id')
->add('orderBy', "f.{$orderBy[0]} {$orderBy[1]}")
->setFirstResult($offset)
->setMaxResults($limit)
->getQuery()
->getArrayResult();
// $genres contains all the genres and the associated movies
return ($films);
}