php – Doctrine QueryBuilder indexBy关于加入的类 – p已经定义了错误

前端之家收集整理的这篇文章主要介绍了php – Doctrine QueryBuilder indexBy关于加入的类 – p已经定义了错误前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用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,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 »

使用只是产品,我得到以下错误

[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;
属性indexBy仅适用于您当前正在选择的实体(如AFAIK);所以在你的情况下,你只能由u.id索引.

这对我来说是有意义的,因为从其他实体索引真的会弄乱返回的结果.唯一可以得到正确结果的情况是:

>主要实体和“目标”indexBy实体的所有加入都是一对一的;
>所有加入都是INNER JOIN;
> resultset的indexBy列是唯一的.

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

在您的示例中,您正在使用LEFT JOIN:所有没有产品的实体会发生什么?全部丢弃,所以LEFT JOIN会让工人像INNER JOIN一样.另外,您的解决方法建议您要组合具有相同索引的实体,但这不是Doctrine如何工作:在Doctrine中,indexBy列必须是唯一的.有关更多信息,请参阅the official docs.

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

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

放弃原则指标,并使用你的作品;
>如果您有反向关联产品 – > UserIngredients,使用Product作为查询的主要实体(from子句,首先出现在select中),然后通过p.id进行索引.

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

希望这个帮助! 原文链接:https://www.f2er.com/php/139646.html

猜你在找的PHP相关文章