Мы разрабатываем систему отслеживания запасов. По сути, у нас есть таблица order
, в которой размещаются заказы. Когда заказ оплачен, статус меняется с 0
на 1
. Эта таблица имеет несколько дочерних элементов в другой таблице order_items
.
Это основная структура.
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
Сначала мы думали о том, чтобы использовать сложные условия поиска , но, возможно, это неправильный подход.
Кроме того, поскольку это не прямое соединение, оно оказывается довольно сложным.
Это код, который мы должны получить на складе для каждого элемента.
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;
}
Спасибо.