인벤토리 추적 시스템을 개발 중입니다. 기본적으로 주문이 접수 된 테이블은 order
입니다. 주문이 지불되면 상태는 0
에서 1
으로 변경됩니다. 이 테이블에는 다른 테이블에 여러 자식이 있습니다. order_items
.CakePHP의 인벤토리 수
이것은 주요 구조입니다.
CREATE TABLE order(
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id INT UNSIGNED,
status INT(1),
total INT UNSIGNED
);
CREATE TABLE order_items(
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
order_id INT UNSIGNED,
article_id INT UNSIGNED,
size enum('s', 'm', 'l', 'xl'),
quantity INT UNSIGNED
);
이제 인수를 위해 비슷한 아키텍처를 갖춘 stocks
테이블이 있습니다. 이것이 구조입니다.
CREATE TABLE stock(
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
article_id INT UNSIGNED
);
CREATE TABLE stock_items(
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
stock_id INT UNSIGNED,
size enum('s', 'm', 'l', 'xl'),
quantity INT(2)
);
주요 차이점 stocks
더 status
필드가 없다는 것이다. 는 우리가 찾고있는 것은 다음 stock_items
에서 각 문서의 크기 합계 order_items
곳 Order.status = 1
에서 각 문서의 크기 합계와 현재의 재고를 찾기 위해이 두 항목을 빼지하는 방법입니다.
이 우리가 단일 쿼리에서 얻을하려는 테이블 :
Size | Stocks | Sales | Available
s | 10 | 3 | 7
m | 15 | 13 | 2
l | 7 | 4 | 3
는 처음에 우리가
complex find conditions를 사용 개황 생각했지만, 아마도 그것은 잘못된 접근입니다.
또한 직접 참여가 아니기 때문에 매우 어렵습니다.
이것은 각 항목의 재고 합계를 검색해야하는 코드입니다.
function stocks_total($id){
$find = $this->StockItem->find('all', array(
'conditions' => array(
'StockItem.stock_id' => $this->find('list', array('conditions' => array('Stock.article_id' => $id)))
),
'fields' => array_merge(
array(
'SUM(StockItem.cantidad) as total'
),
array_keys($this->StockItem->_schema)
),
'group' => 'StockItem.size',
'order' => 'FIELD(StockItem.size, \'s\', \'m\' ,\'l\' ,\'xl\') ASC'
));
return $find;
}
감사합니다. 아마 임시 테이블을 사용하려고 할 것 같은 더 복잡한 여러 단계의 문제에 직면