CakePHP, пишет лучшую строку запроса - PullRequest
1 голос
/ 09 октября 2010

В Cakephp есть лучший способ написать это:

$unread_orders = $this->Order->find('all', array('conditions' => array('Order.status' => 'unread') ));
$read_orders = $this->Order->find('all', array('conditions' => array('Order.status' => 'read') ));
$dispatched = $this->Order->find('all', array('conditions' => array('Order.status' => 'dispatched'), 'limit' => 5));
$canceled = $this->Order->find('all', array('conditions' => array('Order.status' => 'canceled'), 'limit' => 5));

Существует ограничение на отправленные и отмененные товары.

Похоже, что был бы более эффективный способ сделать это, используя один вызов базы данных вместо 4.

Приветствие.

Ответы [ 2 ]

2 голосов
/ 09 октября 2010

Один из способов сделать это

$orders_read_unread = $this->Order->find('all', array('conditions' => array('OR' => array(array('Order.status' => 'unread'), array('Order.status' => 'read')))));
$orders_disp_cancel = $this->Order->find('all', array('conditions' => array('OR' => array(array('Order.status' => 'canceled'), array('Order.status' => 'dispatched'))), 'limit' => 5));

РЕДАКТИРОВАТЬ: обновленные запросы.Спасибо Марк за разъяснения.

0 голосов
/ 09 октября 2010
<?php
    ...
    $orders_read_unread = $this->Order->find( 'all', array(
        'conditions' => array( 'Order.status' => array( 'unread', 'read' )),
        'group' => array( 'Order.status' ),
    ));

    /**
     *  Use this if you need 5 of EITHER canceled OR dispatched order
     *  if you need 5 of EACH you need to break it into two queries.
     */

    $orders_dispatched_canceled = $this->Order->find( 'all', array(
        'conditions' => array( 'Order.status' => array( 'canceled', 'dispatched' )),
        'group' => array( 'Order.status' ),
        'limit' => 5
    ));

    /**
     *  Use these if you need 5 of EACH dispatched AND canceled orders
     */

    $orders_dispatched = $this->Order->find( 'all', array(
        'conditions' => array( 'Order.status' => 'dispatched' ),
        'group' => array( 'Order.status' ),
        'limit' => 5
    ));

    $orders_canceled = $this->Order->find( 'all', array(
        'conditions' => array( 'Order.status' => 'canceled' ),
        'group' => array( 'Order.status' ),
        'limit' => 5
    ));
    ...
?>

Должно помочь вам без необходимости иметь дело с синтаксисом клавиши «ИЛИ». Он сгенерирует немного менее эффективный синтаксис IN ARRAY ('..', '..'), но сделает PHP немного чище.

В качестве альтернативы вы можете посмотреть на любые подзапросы, которые являются проблемой для Cake. В книге приведен пример использования построителя запросов через источник данных для внедрения запроса в массив условий обычного вызова поиска торта.

http://book.cakephp.org/view/1030/Complex-Find-Conditions

И помните, что обе эти находки должны быть в модели внутри функции - вы можете либо определить пользовательский тип поиска, либо просто вызвать функцию модели непосредственно из вашего контроллера.

http://www.pixelastic.com/blog/88:using-custom-find-and-paginate-methods-in-cakephp-1-3

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