2016-06-09 55 views
0

对不起我的英语,我是法国人,整理与许多列

在我的项目,我有实体汽车,船,自行车和这些实体在实体广告的呼叫。价格位于实体汽车,船和自行车,所以为了按价格排序,我需要在我的查询中将Car.price,boat.price和bike.price合并成一列。 我有测试:

$query->addSelect('CONCAT(c.priceTtc, b.priceTtc, bo.priceTtc, t.priceTtc, p.priceTtc) AS all_price'); 
$query->orderBy('all_price', $order); 

,但我的结果不回我的实体广告,但它与广告中的关键0和NULL的关键“all_price”

你有一个解决方案,“为了返回数组通过“我的价格结果?

我车辆

+0

合并不合并:)。 – Alsatian

+0

由于Doctrine无法在您的广告实体中设置'price_all',因此这是完全正常的,因此将其添加到数组中。你想要什么 ?你没有在你的问题中说出来。向我们解释你想如何返回。如果您只是像预期的那样成为广告实体,那么应该在哪里获得all_price结果? – Alsatian

+0

感谢您的回报,我改变了我的帖子。 – Darki666

回答

0

我想你需要的东西是“联盟”而不是“的毗连”的“REGISTRATION_DATE”,“按订单”广告有同样的问题。 “Concat”基本上将不同列的值合并到一行中,这对你的情况没有多大帮助,但是Union将不同查询的结果合并在一起,并且可以将它们排序在一起,但是使用与教条的结合可能有点棘手,并且它需要使用Native SQL

也许最简单的解决方法是使用子查询对其他查询的结果进行查询。这里有一些例子:

Doctrine 2: how do you use a subquery column (in the SELECT clause) http://melikedev.com/2013/06/07/php-doctrine-dql-select-subquery/

您的另一种选择(在我看来,最好的做法)是改变你的实体结构和使用doctrine inheritance(可能单个表类表但不映射超类)。例如,将一个Vehicle实体作为Boat,Bike,Car的父类,并将所有常见属性(如价格)放入其中并直接查询Vehicle并将所有结果(排序和所有内容)结合在一起。

其他替代解决方案(不推荐)是在您的PHP代码中合并和排序来自不同实体(汽车,小船,自行车)的不同查询的结果。

0

我不知道如何使用CONCAT并仅检索广告实体。 你不能用教义做一个子查询。

但我建议直接在各领域要订购:

->orderBy('c.priceTtc',$order) 
->addOrderBy('b.priceTtc',$order) 
->addOrderBy('bo.priceTtc',$order) 
->addOrderBy('t.priceTtc',$order) 
->addOrderBy('p.priceTtc',$order) 

结果应该是一样的。