CakePHP 3에서 생성 된 SQL 함수 쿼리를 연결과 결합하여 사용하고 있습니다.ManyToMany의 CakePHP 3.x - SUM
상황은 다음과 같습니다. 3 개의 테이블, 'products'테이블, 'orders'테이블 및 'orders_products'라는 조인 테이블이 있습니다.
OrdersController의 색인에서 총 가격 (관련 제품 가격의 합계)을 주문 표에 추가하고 싶습니다. 쿼리가 실행될 때
$orders = $this->Orders->find('all')->contain(['Products']);
$orders
->select(['total_price' => $orders->func()->sum('Products.price')])
->group('Orders.id');
그러나, 나는 오류를 얻을 : 나는 트릭을 할해야 다음 컨트롤러 코드에 생각
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;
: SQL에서이 정확히 다음과 같은 쿼리를 수행 할 수 있습니다 :
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Products.price' in 'field list'
... 주문과 제품 간의 연관성이 정의 되더라도.
$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'
]);
감사합니다,이 작동합니다. 그러나 조인 테이블을 수동으로 사용하는 것이 이상하지 않습니까? 이것은'-> contains' 함수가 아니고 모델은 무엇을위한 것입니까? 즉, 조인 테이블과 관련 필드가 지정되었습니다. – Roberto
테이블 간의 관계에 따라, '포함'은 조인을 야기 할 수도 있고, 첫 번째 쿼리가 완료된 후에 두 번째 쿼리가 발행되도록 할 수도 있습니다. 후자의 경우 쿼리가 동일한 쿼리에서 참조되는 모든 테이블을 사용하는 경우 조인을 강제해야합니다. –
설명해 주셔서 감사합니다. 그래도 접근법이 필요하다면 여전히 약간 임의적으로 보인다. – Roberto