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'
]);
謝謝,這個作品。但是,手動使用連接表不是很奇怪嗎?這不是''>包含'功能和模型的用途嗎?我的意思是,連接表和相關字段已被指定。 – Roberto
根據表之間的關係,'contains'可能導致連接,或者可能導致在第一個查詢完成後發出第二個查詢。在後一種情況下,如果您的查詢依賴於在同一查詢中引用的所有表,則必須強制連接。 –
謝謝澄清。儘管如此,仍然有必要採取哪種方法。 – Roberto