2

我想创建自己的方法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);
}

我不知道如何包含其余参数。

4

1 回答 1

1

切片()怎么样?

$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);
}
于 2012-08-02T18:58:36.207 回答