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



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

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

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

如果我只按用户过滤,我在 url 中得到了这个:?类别=0&用户=6&状态=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?
    */
}

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

你可以试试:

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

最新更新