使用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进行索引.

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

希望这个帮助!

总结

以上是DEVMAX为你收集整理的php – Doctrine QueryBuilder indexBy关于加入的类 – p已经定义了错误全部内容。

如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

php – Doctrine QueryBuilder indexBy关于加入的类 – p已经定义了错误的更多相关文章

  1. PHP类(Class)入门教程第1/2页

    对类的摸索~~俺用了半年时间才大概理解类的作用和实现。主要是没有一篇能让我理解的文章(之前没接触过任何OO的东西)。

  2. php类自动加载失败的处理方案及实例代码

    在本篇文章里小编给大家整理了一篇关于php类自动加载失败的处理方案及实例代码,有兴趣的朋友们可以学习参考下。

  3. Symfony2实现在doctrine中内置数据的方法

    这篇文章主要介绍了Symfony2实现在doctrine中内置数据的方法,结合实例形式分析了在doctrine中内置数据的具体步骤与相关技巧,需要的朋友可以参考下

  4. 实例化php类时传参的方法分析

    这篇文章主要介绍了实例化php类时传参的方法,结合实例形式分析了实例化php类时传参的相关原理、实现方法与操作注意事项,需要的朋友可以参考下

  5. 带有变量的PHP模板类?

    谢谢.您当前的策略将起作用,并且非常简单.str_replace()是高效和干净的,您可以简单地循环它以用您的变量内容替换精确的标记匹配.但是,缺点是您必须首先将所有模板加载到字符串中,这可能效率很低.另一种非常相似的方法是,您只需使用extract().Extract将采用一组键/值对,并在本地范围内创建变量.如果在同一范围内包含()模板,那么您的变量就可以运行了.像这样的东西:您的模板可能只是普通的PHP.那么你所要做的就是:

  6. 如何连接常量和变量并使用PHP将其存储在类常量中?

    两个状态consts工作正常,可以在类方法中访问self::STATUS_ERROR和self::STATUS_OK就好了.问题是当我尝试定义第三个常量时如何停止抛出以下错误.解析错误:语法错误,意外’.’,期待’,’或’;’在/home/sub/sub/directory/script.PHP中你没有.常数是不变的.你不能存储任何东西.您可以使用静态属性.您无法在声明中执行此操作,因此您可能更喜

  7. 在PHP中卸载动态类

    我通过以下方式实现了动态加载插件:每个插件定义一个名为PlginImpl的类,它可以正常工作.但是应该可以在process()的返回值内调用指定的其他插件.这会调用上面指定的相同方法,但失败的是:请注意,每个插件都是一个类,即:Plugin提供了一些有用的功能,而PluginInterface定义了ie().我假设所有插件都名为PlginImpl的事实导致问题,因此我的问题是:有没有办法在用require_once加载它后卸载一个类?

  8. 如何在php中调用父类方法

    何时在适当的编码环境中使用范围解析运算符.将printItem定义为静态方法,您可以使用Foo::printItem;或者用子方法调用它:

  9. php – Laravel扩展Form类

    我正在尝试扩展L4.1中的Form类,但我似乎错过了一些东西.我的文件基于API命名为FormBuilder.PHP,保存在app/libraries/extended/FormBuilder.PHP中.这实际上是我第一次尝试在Laravel中扩展核心类.我似乎无法指出如何正确扩展像这个Form类的核心类.编辑:我将“app/libraries/extended”添加到我的composer.jso

  10. php – 获取特定类的所有对象

    我必须通过引用列出作为类实例的对象我需要一个解决方案来获取所有Foo类实例的对象你知道怎么做吗?获取类的所有实例的解决方案是在创建实例化类时保留它们的记录:现在全局可访问的数组Foo::$instances将包含该类的所有实例.你的问题有点宽泛,所以我不能确切地说这是你正在寻找的.如果没有,它有望帮助你更清楚地了解你正在寻找什么.

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部