对象与数组结果

时间:2018-06-11 07:22:30

标签: symfony doctrine-orm

在我的搜索过滤器 (FormBuilder)中返回过滤结果列表,我有一个与对象相关的表单(多个复选框)< / em>的。它不起作用。 我认为我的存储库存在问题,无法获得数组与对象结果。

<?php

namespace AdminBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;

use Symfony\Bridge\Doctrine\Form\Type\EntityType;

use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Validator\Constraints as Assert;

use AdminBundle\Entity\Products;
use AdminBundle\Form\ProductsType;

class ProductsController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction(Request $request)
    {
        $form = $this->createFormBuilder()
            ->add('category', 'entity', array(
               'class' => 'AdminBundle:Category',
               'label' => false,
               'choice_label' => 'name',
               'required' => false,
               'expanded' => true,
               'placeholder' => 'Tous',
               'multiple' => true
           ))

           // ...
       ;

这是我的存储库:

<?php

namespace AdminBundle\Repository;

class ProductsRepository extends \Doctrine\ORM\EntityRepository
{
    public function ListAll($data)
    {
        $query = $this->createQueryBuilder('a')->orderBy('a.updated','DESC');

        // CATEGORY
        if($data['category'] !== null)
        {
            $query
                ->innerJoin('a.category', 'cat')
                ->andWhere('cat.id = :catid')
                ->setParameter('catid', $data['category'])
            ;

            /*
            $query
                ->leftJoin('a.category', 'category')
                ->setParameter('category', $data['category'])
            ;
            */
        }

        // ...
    }
}

此存储库仅适用于单个选择:multiple => false。当我设置multiple => true时,我得到关于对象与数组的SQL违规。

如何处理多个复选框的存储库?

1 个答案:

答案 0 :(得分:0)

您必须使用ChoiceType而不是entityType

class CategoryRepository extends \Doctrine\ORM\EntityRepository
{
public function getForSearch()
{
    $qb = $this->createQueryBuilder('category');

    $qb->orderBy('category.name');
    $query = $qb->getQuery();

    $results = $query->getResult();
    $categories = array();

    foreach ($results as $category) {
        $categories[$category->getName()] = $category->getId();
    }

    return $categories;
}

表格

$categories = $em->getRepository(Category::class)->getForSearch();

 ->add('categories', ChoiceType::class, array(
            'choices' => $categories,
            'required' => false,
            'placeholder' => 'Select',
        ))

在控制器中:

if ($search_form->isSubmitted() && $search_form->isValid()) {
        $data = $search_form->getData();
        $em->getRepository(Product::class)->ListAll($data);

我也认为我们可以使用数据转换器,但我不知道如何做到这一点