使用Symfony2过滤信息和自定义存储库?

时间:2014-02-26 12:22:58

标签: forms symfony doctrine-orm repository

从GET参数,我想从我的实体获取信息。

在我看来,我创建了一个包含3个选择(不是多个选择)的表单,如下所示:

http://pix.toile-libre.org/upload/original/1393414663.png

如果我只按用户过滤,我会在网址中显示:?category = 0& user = 6& status = 0

我必须处理0值......

此表单用于过滤我的任务。

这是我在控制器中操作的一部分:

if($request->query->has('user')) {
    $category_id = $request->query->get('category');
    $user_id = $request->query->get('user');
    $status_id = $request->query->get('status');

    // A little test to see if it works.
    echo $category_id . '<br>' . $user_id . '<br>' . $status_id;

    // I will pass these variables to a repository
    $tasks = $em->getRepository('LanCrmBundle:Task')->findFiltered($category_id, $user_id, $status_id);
} else {
    $tasks = $em->getRepository('LanCrmBundle:Task')->findAll();
}

我用这种方法创建了一个存储库:

public function findFiltered($category_id, $user_id, $status_id)
{
    /**
    * Get filtered tasks.
    *
    * Get only title, priority, created_at, category_id, user_id and status_id fields (optimization)
    *
    * Where field category_id = $category_id unless $category_id is smaller than 1 (not secure enough)
    * Where field user_id = $user_id unless $user_id is smaller than 1 (not secure enough)
    * Where field status_id = $status_id unless $status_id is smaller than 1 (not secure enough)
    * Should I do these tests here or in the controller?
    */
}

如何进行此查询?你还有其他优雅的建议来解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试:

public function findFiltered($category_id, $user_id, $status_id)
{
    $queryBuilder = $this->createQueryBuilder('t');

    if(!empty($category_id) && is_numeric($category_id)) {
        $queryBuilder->andWhere('t.category = :category')->setParameter('category', $category_id);
    }

    if(!empty($user_id) && is_numeric($user_id)) {
        $queryBuilder->andWhere('t.user = :user')->setParameter('user', $user_id);
    }

    if(!empty($status_id) && is_numeric($status_id)) {
        $queryBuilder->andWhere('t.status = :status')->setParameter('status', $status_id);
    }

    return $queryBuilder->getQuery()->getResult();

}