CakePHP: Не знаете, как справиться с полусложными отношениями

Я работаю над своим первым приложением CakePHP, системой заказов/счетов. Часть заказа идет хорошо, но для счетов мне нужна помощь.

структура базы данных, которую я использую; Накладная состоит из нескольких продуктов, которые, в свою очередь, состоят из нескольких повторно используемых элементов (например, нескольких лотков и самого продукта). . Теперь, поскольку некоторые клиенты заказывают большие количества, они получают более низкие ставки, которые зависят от времени (с 1 по 9 неделю 1 евро за элемент y и с 10 по 8 неделю 1,20 евро за тот же элемент). Конечно, некоторые клиенты просто должны использовать ежедневные цены, которые будут храниться таким же образом, только с nulled customer_id.

Теперь моя проблема; Я совершенно не представляю, как мне работать с представлением счетов, а точнее; как лучше всего получить данные, или я должен просто пойти и попрактиковаться в своих навыках написания SQL.


person marijnvdwerf    schedule 11.04.2011    source источник


Ответы (1)


Я не вижу серьезных проблем с вашей схемой. Поведение Containable должно упростить эту задачу. Добавьте его в свою модель счета:

var $actsAs = array('Containable');

Упростите себе жизнь, добавив отношение DefaultPrice для каждого элемента. В вашей модели элемента:

var $hasOne = array(
    'DefaultPrice' => array(
        'className' => 'Price',
        'foreignKey' => 'element_id',
        'conditions' => array('DefaultPrice.customer_id IS NULL')
    )
);

Теперь, чтобы построить свой счет, настройте и передайте параметр содержимого вашей операции поиска. (Я предполагаю, что вы хотите показать разбивку стоимости элементов, верно?)

$contain  = array(
    'DeliveryNote' => array(
        'Product' => array(
            'Element' => array(
                 'DefaultPrice',
                 'Price' => array(
                     'conditions' => array('Price.customer_id' => $customer_id)
                 )
             )
         )
     )
);
$this->Invoice->find('first', array('conditions' => ..., 'contain' => $contain));

Это должно привести к тому, что каждая запись элемента будет включать DefaultPrice, и если клиент получает специальную цену, запись Price также будет включена.

Примечание. Вы можете рассмотреть возможность включения поля default_price в поле "Элемент" и избежать дополнительного объединения, описанного выше. Каждый элемент будет иметь цену по умолчанию, верно?

person Tyler    schedule 11.04.2011
comment
Спасибо, но проблема в том, что цены на некоторые элементы должны быть основаны на дате. Это для фирмы по переработке клубники, и цены колеблются в зависимости от спроса и сезона. - person marijnvdwerf; 11.04.2011
comment
Вы достигаете этого, передавая дополнительные условия для цены в параметре содержимого, где вы передаете $customer_id. то есть: «Цена.от» ‹= $сейчас / «Цена.до» ›= $сейчас. Если Price окажется пустым, вы должны по умолчанию использовать DefaultPrice. - person Tyler; 11.04.2011
comment
Хм, но поскольку мне придется использовать DeliveryNote.delivery_date, я думаю, мне сначала нужно получить все DeliveryNotes для счета-фактуры, а затем пройтись по примечаниям, чтобы получить все элементы. Верно? - person marijnvdwerf; 11.04.2011
comment
Работает ли передача «DeliveryNote.delivery_date» в условиях? 'Цена.от' ‹= 'DeliveryNote.delivery_date' - person Tyler; 12.04.2011
comment
Ничего себе, не видел, что один идет! (хотя я все еще чувствую, что ручной запрос будет означать меньший износ базы данных, его легче поддерживать) - person marijnvdwerf; 12.04.2011
comment
Не обращайте внимания на мой последний комментарий, он не работает, мой запрос цены почему-то выглядит так: SELECT Price.id, Price.element_id, Price.customer_id, Price.from, Price.until, Price.price ОТ prices КАК Price ГДЕ ((Price.until IS NULL) ИЛИ (Price.until ›= 'Накладная.дата_доставки')) И Price.from ‹= 'Накладная.дата_доставки' ​​И Price.element_id = (1) ЗАКАЗ BY Price.customer_id desc LIMIT 1 - person marijnvdwerf; 12.04.2011