Symfony 2 & Doctrine 2 - 创建自定义 findBy() 方法


Symfony 2 & Doctrine 2 - create a custom findBy() method

我想创建自己的方法findBy()。我有两个实体:FilmGenre。此自定义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('models'Gender')->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);
}