2016-12-13 22 views
2

在本question和描述與「不可能」 回答我打開了一個新問題MYSQL教義排序

所以我的問題是這樣的: 我有一個表(的ServiceProvider表) 每個服務提供者有許多與OneToMany關係有關的報價(Offer表),並且每個Offer都有一個具有ManyToOne關係的主服務(服務表)。 我想要做的是按照與serviceProvider.points和serviceProvider.name相關的順序獲取所有服務提供者及其服務,並且每個服務提供者的服務應按照他們的要點進行排序。 所以對於更清晰的視野,讓我們說,我有以下

ServiceProvider 
------------------------------------------------- 
id  |  name  | points |offers| 
------------------------------------------------- 
1  |  c  |  2  |1,2,3 | 
------------------------------------------------- 
2  |  b  |  1  |1,2 | 
------------------------------------------------- 
3  |  a  |  0  |1,3 | 
------------------------------------------------- 
ServiceOffer 
----------------------------------- 
id  |  name  |service| 
----------------------------------- 
1  |  a   | 1 | 
----------------------------------- 
2  |  b   | 1 | 
----------------------------------- 
3  |  c   | 2 | 
----------------------------------- 
Service 
----------------------------------- 
id  | name | points | 
----------------------------------- 
1  |  a  |  23 | 
----------------------------------- 
2  |  b  |  88 | 
----------------------------------- 

我究竟需要的是這樣的

results 
service_provider.name| offers.name | 
------------------------------------- 
c     | b , a  | 
------------------------------------- 
b     | a , b  | 
------------------------------------- 
a     | b , a  | 
------------------------------------- 

這樣的結果是我試過的查詢,但它不工作

$query->select("sp") 
      ->from("CoreBundle:ServiceProvider","sp") 
      ->andWhere("sp.city = :city_name")->setParameter("city_name",$cityName) 
      ->innerJoin("sp.offers","offer") 
      ->innerJoin("offer.service","service","with","offer.service = service") 
      ->orderBy("sp.points DESC , sp.name ASC , service.points"); 

必填字段

在服務提供者

/** 
* @var ServiceOffer 
* 
* @ORM\OneToMany(targetEntity="ServiceOffer", mappedBy="serviceProvider") 
*/ 
private $offers; 

服務

/** 
* @var integer 
* 
* @ORM\Column(name="points", type="integer", nullable=true) 
*/ 
private $points; 

在服務提供

/** 
* @ORM\ManyToOne(targetEntity="Service", inversedBy="offer") 
* @ORM\JoinColumn(name="service_id", referencedColumnName="id") 
* 
* @Serializer\Expose 
* @Serializer\Groups({"service-offer", "order-entry"}) 
* 
* @Assert\NotBlank(message="constraint.serviceOffer.service.not_blank") 
*/ 
private $service; 
+0

爲什麼報價是的ServiceProvider表列表? –

+0

,因爲這是我擁有的數據庫模型:/ –

+0

您是否可以包含實體代碼?我不認爲地圖是正確的。 –

回答

0

你不能簡單地列舉ORDER BY指令教義。你可以給一個方法調用->orderBy(),給這個字段使用和指導(可選,默認爲ASC)作爲參數,並且必須使用addOrderBy方法添加更多的順序字段。您的查詢應該像

$query->select("sp") 
    ->from("CoreBundle:ServiceProvider","sp") 
    ->andWhere("sp.city = :city_name")->setParameter("city_name",$cityName) 
    ->innerJoin("sp.offers","offer") 
    ->innerJoin("offer.service","service","with","offer.service = service") 
    ->orderBy("sp.points", "DESC") 
    ->addOrderBy("sp.name", "ASC") 
    ->addOrderBy("service.points"); 

See the documentation on this topic.

+0

添加順序可以像這樣工作 - > orderBy(「sp.points DESC,sp.name ASC,service.points」) 它在文檔中,即使我將它分割爲addOrderBy,最終得到一個ServiceProvider,並且它不會訂購與服務點相關的優惠:/ –

+0

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/ordered-associations.html –

+0

@ YamenImadNassif在查詢生成器的情況下,您只能添加一個與orderBy的排序,以及addOrderBy的其他排序。您的鏈接使用DQL,而不是querybuilder。見:https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/QueryBuilder.php#L1259 – Richard

0

的@SolarBear的答案几乎是正確的。

$query->select("sp, offer, service") 
    ->from("CoreBundle:ServiceProvider","sp") 
    ->andWhere("sp.city = :city_name")->setParameter("city_name",$cityName) 
    ->innerJoin("sp.offers","offer") 
    ->innerJoin("offer.service","service") 
    ->orderBy("sp.points", "DESC") 
    ->addOrderBy("sp.name", "ASC") 
    ->addOrderBy("service.points","DESC"); 

注意,我刪除了服務Inner Join中不必要的代碼。更重要的是,在service.points的順序中加上'DESC'字符串。它應該做的伎倆。

讓我們跳轉到你的例子:

首先,我真的不明白你在ServiceProvider.offers列映射。其次,我更改這些表的名稱以更清楚地顯示預期結果。

的ServiceProvider

------------------------------------------------- 
id  |  name  | points |offers| 
------------------------------------------------- 
1  |  C  |  2  |1,2,3 | 
------------------------------------------------- 
2  |  B  |  1  |1,2 | 
------------------------------------------------- 
3  |  A  |  0  |1,3 | 
------------------------------------------------- 

ServiceOffer

----------------------------------- 
id  |  name  |service| 
----------------------------------- 
1  |  Z   | 1 | 
----------------------------------- 
2  |  Y   | 1 | 
----------------------------------- 
3  |  X   | 2 | 
----------------------------------- 

服務

----------------------------------- 
id  | name | points | 
----------------------------------- 
1  |  J  |  23 | 
----------------------------------- 
2  |  K  |  88 | 
----------------------------------- 

結果

ServiceProvider.name | offers.name   |  
--------------------------------------------- 
     C    | X, Y, Z or X, Z, Y | <---- I explain below 
---------------------------------------------  
     B    | Y, Z or Z, Y  | <---- Same 
--------------------------------------------- 
     A    | X, Z    | 
--------------------------------------------- 

在此示例中,SeviceOffer X使用服務Kpoints 88)。而ServiceOffer YZ使用服務Jpoints 23),因此ServiceProvider YZ之間有一個平局,因此數據庫可以按任意順序返回它們。

編輯

關於 「報價」 專欄。注意你映射爲一對多關係。但是請注意,在給定的表格示例中聽起來像是多對多。一旦ServiceProvider有很多ServiceOffer,反之亦然。因此,爲了正常工作,您應該創建一個連接表並刪除優惠欄。 並在ServiceProvider中映射一個ManyToMany relationship。 如:

Providers_Offers

------------------------------ 
provider_id | offer_id | 
------------------------------ 
     1  |  1  | 
------------------------------ 
     1  |  2  | 
------------------------------ 
     1  |  3  | 
------------------------------ 
     2  |  1  | 
------------------------------ 
     2  |  2  | 
------------------------------ 
     3  |  1  | 
------------------------------ 
     3  |  3  | 
+1

我非常感謝您的努力,但出於某種原因我通過service.points添加訂單首先我只有一個服務提供商,即使這樣的優惠不是服務點排序:/ 我試過所有你和@Solar熊提到非他們似乎工作 試圖夫婦更多的東西沒有工作以及 我想有一些錯誤的DB模式或東西 與addOrderBy被賦予了相同的結果實際上分裂當我與一個使用它的OrderBy 我今晚會嘗試在另一個分貝,如果它的工作,我會接受答案 –

+0

「我真的不明白你在地圖中映射」我想這裏是映射的問題或什麼 ,因爲我提到它有點大數據庫和實體顯示所有,但我會讓你知道,只要我找到這個 –

+0

的解決方案我想問題在那裏,在「提供」列。 –