加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – Doctrine QueryBuilder indexBy关于加入的类 – p已经定

发布时间:2020-12-13 14:02:44 所属栏目:PHP教程 来源:网络整理
导读:使用symfony2 / doctrine2,我很难为我的查询定义一个索引. 我的代码: $queryBuilder = $this-_em -createQueryBuilder() -select('u,uis,cost,p,stock') -from('AppBundle:FoodAnalyticsUserIngredient','u','p.id') -leftJoin('u.product','p') -leftJoin
使用symfony2 / doctrine2,我很难为我的查询定义一个索引.

我的代码:

$queryBuilder = $this->_em
        ->createQueryBuilder()
        ->select('u,uis,cost,p,stock')
        ->from('AppBundle:FoodAnalyticsUserIngredient','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:FoodAnalyticsUserIngredient 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进行索引.

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

希望这个帮助!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读