2016-08-13 7 views
0

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' 
    ]); 

답변

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

감사합니다,이 작동합니다. 그러나 조인 테이블을 수동으로 사용하는 것이 이상하지 않습니까? 이것은'-> contains' 함수가 아니고 모델은 무엇을위한 것입니까? 즉, 조인 테이블과 관련 필드가 지정되었습니다. – Roberto

+0

테이블 간의 관계에 따라, '포함'은 조인을 야기 할 수도 있고, 첫 번째 쿼리가 완료된 후에 두 번째 쿼리가 발행되도록 할 수도 있습니다. 후자의 경우 쿼리가 동일한 쿼리에서 참조되는 모든 테이블을 사용하는 경우 조인을 강제해야합니다. –

+0

설명해 주셔서 감사합니다. 그래도 접근법이 필요하다면 여전히 약간 임의적으로 보인다. – Roberto