使用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