Инвентаризация в CakePHP - PullRequest
2 голосов
/ 05 апреля 2010

Мы разрабатываем систему отслеживания запасов. По сути, у нас есть таблица 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;
}

Спасибо.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2010

На самом деле, я думаю, что это невозможно. В итоге я сделал запрос к двум таблицам, а затем провел вычисления с помощью PHP.

0 голосов
/ 11 ноября 2010

Столкнувшись с более сложной многошаговой проблемой, как я, вероятно, попытался бы использовать временную таблицу.

Итак:

Создайте временную таблицу с наборами значений из stock_items, а затем обновите эту таблицу на основе вашей логики связывания с order_items.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...