【问题标题】:Symfony3 how to bind an array with Doctrine 2Symfony3 如何将数组与 Doctrine 2 绑定
【发布时间】:2018-04-07 06:38:17
【问题描述】:

我有一个数组$brands 作为我的存储库函数public function getBrandsByFilter($brands) 的参数。我从 ajax POST 方法中拯救了这个数组,它看起来像:

$brands = ["brand"  
    [
      "caporal" => "caporal"
      "adidas" => "adidas"
    ]
]

我想将数组的每个值(caporal、adidas)作为我的存储库的 WHERE 查询子句的参数传递,但我有这个例外:

An exception occurred while executing 'SELECT a0_.brand AS brand_0 FROM article a0_ WHERE a0_.brand IN (?, ?) GROUP BY a0_.brand' with params ["caporal", "adidas"]:

SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

这是我的存储库ArticleRepository.php

 public function getBrandsByFilter($brands)
 {
     $qb = $this->createQueryBuilder('a');
     $qb
         ->select('a')
         ->andWhere('a.brand IN (:brandFilter)')
         ->setParameter('brandFilter', $brands, Connection::PARAM_STR_ARRAY);

     return $qb->getQuery()->getResult();
 }

更新:此问题已解决,它来自评论中所述的数组格式错误。但另一方面,我有一个新的以下问题。

在我的控制器中,我很好地检索了我的查询结果 getBrandsByFilter(),但我无法将其发送到 jsonResponse()toward Ajax

这是我的controller 代码:

    /**
     * @Route("/ajax/request", options={"expose"=true}, name="ajax_request")
     * @Method({"POST"})
     */
    public function ajaxRequestAction(Request $request)
    {
        if ($request->isMethod('post')) {
            $brands = $request->request->get('brand');

            $repository = $this->getDoctrine()->getRepository('ArticleBundle:Article');

            /* I retrieve my query result */
            $articles = $repository->getBrandsByFilter($brands);

            /* And send it toward Ajax */
            $response = new JsonResponse();
            return $response->setData(array('data' => $articles));
        }
    }

这里是我的ajax 函数:

    $('#submitFilter').click(function () {

        $.ajax({
            type: 'POST',
            url: Routing.generate("ajax_request"),
            data: { brand: selectedBrand },
            dataType: 'json'
        })
            // HERE I WANT RETRIEVE MY JsonRESPONSE
            .done(function( data ) {
                console.log(data);

                for ( var i = 0; i < data.length; i++ ) {
                    Object.keys(data[i]).forEach(function (key) {
                        var propertyData = data[i][key];
                        //console.log(key);
                        //
                    })
                }
            });
    })

当我在控制器中调试 $articles 变量时,我有一个这样的对象数组:

array:8 [▼
  0 => Article {#612 ▼
    -id: 203
    -fosUserId: null
    -name: "article 1"
    -category: "sous-vêtements"
    -brand: "caporal"
    -model: "running"
    -gender: "unisex"
  1 => Article {#610 ▶}
  2 => Article {#631 ▶}
  3 => Article {#619 ▶}
  4 => Article {#657 ▶}
  5 => Article {#635 ▶}
  6 => Article {#695 ▶}
  7 => Article {#633 ▶}
] 

但是当我在我的 ajax 中调试 data 时,我有一个空对象数组:

data: Array(8)
    0: {} 
    1: {}
    2: {}
    3: {}
    4: {}
    5: {}
    6: {}
    7: {}

我不知道为什么我在 JsonRESPONSE 中发送的对象已填充时检索一组 EMPTY 对象。谢谢你帮助我理解。

【问题讨论】:

    标签: arrays doctrine-orm bind symfony-3.3


    【解决方案1】:

    $brands数组的内容应该是这样的;

    $brands = [
        ["caporal" => "caporal"], ["adidas" => "adidas"]
    ];
    

    或者;

    $brands = [
        ["caporal"], ["adidas"]
    ];
    

    它会起作用,但我认为你不应该使用-&gt;andWhere-&gt;where 处理这种情况。

    【讨论】:

    • 谢谢你的回答是对的,但是我有一个新问题,如果你能看一下就好了
    • hım,试试看->return new JsonResponse(array('articles' =&gt; $articles));另外,你加了@Method({"POST"}),所以不用检查if ($request-&gt;isMethod('post'))
    • 我已经尝试过了,但没有任何改变.. 我的印象是文章对象的数组有问题
    【解决方案2】:

    我在另一个问题中找到了解决方案,不幸的是我以前从未见过。

    您必须将getResult 替换为getArrayResult 才能获得格式良好的查询结果数组。见solution of the issue

    public function getBrandsByFilter($brands)
     {
         $qb = $this->createQueryBuilder('a');
         $qb
             ->select('a')
             ->andWhere('a.brand IN (:brandFilter)')
             ->setParameter('brandFilter', $brands, Connection::PARAM_STR_ARRAY);
    
         /* Here replace getResult() by getArrayResult() */
         return $qb->getQuery()->getArrayResult();
     }
    

    在控制器中:

    /**
     * @Route("/ajax/request", options={"expose"=true}, name="ajax_request")
     * @Method({"POST"})
     */
    public function ajaxRequestAction(Request $request)
    {
        if ($request->isMethod('post')) {
            $brands = $request->request->get('brand');
    
            $repository = $this->getDoctrine()->getRepository('ArticleBundle:Article');
    
            $articles = $repository->getBrandsByFilter($brands);
    
            return new JsonResponse($articles);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      • 2018-03-23
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      相关资源
      最近更新 更多