php not 学习QueryBuilder indexBy加入类-p已经定义错误



yii2 not like (1)

indexBy属性只适用于你正在选择的实体,就像你猜测的那样(和AFAIK)。 所以在你的情况下,你只能通过u.id索引。

这对我来说是有意义的,因为从其他实体索引真的搞砸了返回的结果。 唯一的情况是你会得到正确的结果是:

  • 主实体和“目标”indexBy实体的所有连接都是一一对应的;
  • 所有的连接都是INNER JOIN;
  • 结果集的indexBy列是唯一的。

在其他情况下,在水合过程中你会丢失一些实例参考。

在你的例子中,你正在使用LEFT JOIN:没有产品的所有实体会发生什么? 全部丢弃,所以LEFT JOIN将有一个像INNER JOIN一样的工人。 此外,你的解决方法建议你想要将实体与相同的索引结合起来,但这不是如何工作的:在Doctrine中,indexBy列必须是唯一的。 有关更多信息,请参阅官方文档

请注意,您可以在JOIN子句中使用p.id .但这具有不同的含义。 这意味着,当保护UserIngredients实例时,产品的集合应该通过id进行索引。

所以,我的建议是遵循这两个解决方案之一:

  • 放弃学说indexBy,并用你的工作空间;
  • 如果反向关联Product -> UserIngredients ,则使用Product作为查询的主要实体(from子句,首先出现在select中),然后通过p.id进行索引。

哪一个要使用取决于你的业务逻辑,但是我通常更喜欢第二个解决方案,因为第一个生成多级数组,这更好地表示为实体关系。

希望这个帮助! :)

使用symfony2 / doctrine2,我很难为我的查询定义一个索引。

我的代码:

    $queryBuilder = $this->_em
        ->createQueryBuilder()
        ->select('u, uis, cost, p, stock')
        ->from('AppBundle:FoodAnalytics\UserIngredient', 'u', 'p.id')
        ->leftJoin('u.product', 'p')
        ->leftJoin('u.numberObjects', 'stock')
        ->leftJoin('u.userIngredientSuppliers', 'uis')
        ->leftJoin('uis.numberObjects', 'cost')
        ->where('u.user = ?1')
        ->setParameter(1, $portfolioUser)
        ;

我得到以下错误:

[Semantical Error] line 0, col 110 near 'p LEFT JOIN u.numberObjects': Error: 'p' is already defined.
500 Internal Server Error - QueryException
1 linked Exception: QueryException »

[1/2] QueryException: SELECT u, uis, cost, p, stock FROM AppBundle:FoodAnalytics\UserIngredient u INDEX BY p.id LEFT JOIN u.product p LEFT JOIN u.numberObjects stock LEFT JOIN u.userIngredientSuppliers uis LEFT JOIN uis.numberObjects cost WHERE u.user = ?1   +

使用u.product我得到以下错误:

[Semantical Error] line 0, col 87 near 'product LEFT': Error: Invalid PathExpression. Must be a StateFieldPathExpression.
500 Internal Server Error - QueryException
1 linked Exception: QueryException »

只使用product ,我得到以下错误:

[Semantical Error] line 0, col 85 near 'product LEFT': Error: 'product' does not point to a Class.
500 Internal Server Error - QueryException
1 linked Exception: QueryException »

它工作正常,如果我使用u.id我可以只使用从同一个表中的字段索引?

我能做些什么来使它工作?

Thansk很多!

编辑:

作为我正在使用的临时修复程序:

    $result = $queryBuilder->getQuery()->getResult();
    $result = array_combine(array_map(function(UserIngredient $userIngredient){
                return $userIngredient->getProduct()->getId();
            }, $result), $result);
    return $result;