Php 按类别查找产品-自定义查询

Php 按类别查找产品-自定义查询,php,symfony,Php,Symfony,我试图在主页上列出类别/计算机、笔记本电脑、打印机../中的产品,但由于某些原因,查询不会返回任何结果。我在论坛上看到了其他类似的话题,但没有一个有帮助 //产品存储库 公共函数findByCategoryint$page=1,数组$category[]:Paginator { $qb=$this->createQueryBuilder'p' ->addSelect'c' ->leftJoin'p.category','c' ->其中'c.name=:name' ->设置参数'name',$ca

我试图在主页上列出类别/计算机、笔记本电脑、打印机../中的产品,但由于某些原因,查询不会返回任何结果。我在论坛上看到了其他类似的话题,但没有一个有帮助

//产品存储库 公共函数findByCategoryint$page=1,数组$category[]:Paginator { $qb=$this->createQueryBuilder'p' ->addSelect'c' ->leftJoin'p.category','c' ->其中'c.name=:name' ->设置参数'name',$category; 返回新分页器$qb->分页$page; } //家庭控制器 公共功能索引$page,ProductRepository$ProductRepository, CategoryRepository$CategoryRepository { $category=新类别; $categories=$categorirepository->findBy['name'=>$categority->getName];//'name'=>“计算机”或“笔记本电脑”或“打印机” $products=$productRepository->findByCategory$page,$categories; 返回$this->render'home/index.html.twig'[ “paginator”=>$products ]; } 您正在使用存储库中的分页器,这违反了分离关注点的目的

存储库应仅用于查询

Paginator不是那样使用的。要获得该服务,您不需要创建一个新对象,而是从诸如$paginator=$this->get'knp_paginator'之类的服务获取它

然后,它是这样使用的:

$products = $paginator->paginate($query, $page, $limit);
$query作为查询

您需要将存储库更改为:

public function findByCategory(int $page = 1, array $category [])
{
    $qb = $this->createQueryBuilder('p')
        ->addSelect('c')
        ->leftJoin('p.category', 'c')
        ->where('c.name = :name')
        ->setParameter('name', $category);

    // $qb is actually a QueryBuilder. You need a Query
    return $qb->getQuery();
}
现在,在控制器中:

public function index(int $page, ProductRepository $productRepository,
                      CategoryRepository $categoryRepository)
{
    $category = new Category();
    $categories = $categoryRepository->findBy(['name' => $category->getName()]); // 'name' => 'Computers' or 'Laptops' or 'Printers'

    $productsQuery = $productRepository->findByCategory($page, $categories);

    $products = $paginator->paginate($productsQuery, $page);
    return $this->render('home/index.html.twig', [
        'paginator' => $products
    ]);
}

您已经加载了类别,因此可以直接将其传递给查询,而无需按类别名称显式搜索:

public function findByCategory(int $page = 1, array $category): Paginator
{
    $qb = $this->createQueryBuilder('p')
        ->where('p.category = :category')
        ->setParameter('category', $category);

    return (new Paginator($qb))->paginate($page);
}
当只有一个元素时传递数组时,这将起作用,但如果可以在多个类别中搜索,则必须更改运算符:

->where('p.category IN (:category)')

问题是您创建了一个对象

$category = new Category();
并且$category->getName为空

$categories = $categoryRepository->findBy(['name' => $category->getName()]); // 'name' => 'Computers' or 'Laptops' or 'Printers'

那么findby没有找到任何类别

产品可以有多个类别吗?通过返回类别数组查找Paginator是什么?来自KnpLabs的捆绑包?@AndreaManzi不,许多产品都有一个类别-多个类别的关系为什么不使用findBy的istead?我认为这种方式是错误的,在索引页中您没有发送类别,因此,如果您没有要筛选的类别$category->getName在控制器中找不到任何类别该函数的第二个参数是什么?@whisky_u按原来的方式使用$categories变量,但是请注意@Andrea指出的,您的搜索没有返回任何结果,因为实例化后getName为空。例如,您可以使用$categories=$categoryRepository->findByName'Laptops';使用静态方式,查询就像一个魔咒,但试图使其成为动态的,因为每个类别都有导航选项卡。是的,我理解我的错误。@wicky_uu你是如何传递参数的?你检查过你得到了期望值吗?