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

时间:2012-08-02 09:05:27

标签: php symfony doctrine-orm

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

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

1 个答案:

答案 0 :(得分:1)

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);
}