2016-08-13 123 views
0

我遇到了使用CakePHP 3中進行的SQL函數查詢與關聯的組合。CakePHP 3.x-SUM()ManyToMany

情況如下:我有三個表,'產品'表,'訂單'表和一個名爲'orders_products'的連接表。

在OrdersController的索引中,我想將總價格(=相關產品價格之和)添加到訂單表中。

SELECT orders.id, SUM(products.price) 
FROM orders 
LEFT JOIN orders_products 
ON orders.id = orders_products.order_id 
LEFT JOIN products 
ON orders_products.product_id = products.id 
GROUP BY orders.id; 

我想通以下的控制器代碼應該做的伎倆:

$orders = $this->Orders->find('all')->contain(['Products']); 

$orders 
     ->select(['total_price' => $orders->func()->sum('Products.price')]) 
     ->group('Orders.id'); 

然而,在執行查詢對象的時候,我得到一個錯誤在SQL這正好可以用下面的查詢來完成:

​​3210

...即使定義了訂單和產品之間的關聯。

只調用$orders = $this->Orders->find('all')->contain(['Products'])->all();確實會返回一個訂單數組,並且每個訂單都有多個產品,因此該模型必須正確設置。任何想法可能是錯誤的?提前致謝!

OrdersTable

$this->belongsToMany('Products', [ 
    'foreignKey' => 'order_id', 
    'targetForeignKey' => 'product_id', 
    'joinTable' => 'orders_products' 
]); 

而且從ProductsTable

$this->belongsToMany('Orders', [ 
     'foreignKey' => 'product_id', 
     'targetForeignKey' => 'order_id', 
     'joinTable' => 'orders_products' 
    ]); 

回答

2

一種方式做到這一點:

$orders = $this->Orders->find() 
    ->select([ 
     'order_id' =>'orders.id', 
     'price_sum' => 'SUM(products.price)' 
    ]) 
    ->leftJoin('orders_products', 'orders.id = orders_products.order_id'), 
    ->leftJoin('products', 'orders_products.product_id = products.id') 
    ->group('orders.id'); 
+0

謝謝,這個作品。但是,手動使用連接表不是很奇怪嗎?這不是''>包含'功能和模型的用途嗎?我的意思是,連接表和相關字段已被指定。 – Roberto

+0

根據表之間的關係,'contains'可能導致連接,或者可能導致在第一個查詢完成後發出第二個查詢。在後一種情況下,如果您的查詢依賴於在同一查詢中引用的所有表,則必須強制連接。 –

+0

謝謝澄清。儘管如此,仍然有必要採取哪種方法。 – Roberto