2013-03-26 3 views
0

Я только что наследовал проект, и мне нужно переработать немного кода, чтобы разбиение на страницы бесконечного скроллера продолжало работать должным образом.Комплексный рефакторинг запросов CakePHP

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

Вот код, который в конечном счете работал:

$catData = $this->find('all',array(
      'conditions' => array(
       'Indexer.type' => 'Category', 
       'Listing.listing_id IS NOT NULL' 
      ), 
      'joins' => array(
       array('table' => 'peeka_product_category_link', 
        'alias' => 'Link', 
        'type' => 'LEFT', 
        'conditions' => array(
         'Link.category_id = Category.category_id' 
        ) 
       ), 
       array('table' => 'peeka_products', 
        'alias' => 'Product', 
        'type' => 'LEFT', 
        'conditions' => array(
         'Product.product_id = Link.product_id' 
        ) 
       ), 
       array('table' => 'peeka_listings', 
        'alias' => 'Listing', 
        'type' => 'LEFT', 
        'conditions' => array(
         'Listing.product_id = Product.product_id', 
         'Listing.listing_end_date >=' => $date, 
         'Listing.listing_start_date <=' => $date, 
         "Listing.listing_status = 'Active'" 
        ) 
       ), 
      ), 
      'order' => 'Category.category_name ASC', 
      'limit' => $set_limit, 
      'fields' => array('Category.category_id, Category.category_name, Indexer.url'), 
      'group' => 'Category.category_id', 
      'recursive' => 0 
     )); 

EDIT: Благодаря Дейву это работает, и теперь я просто хотел отправить его для дальнейшего использования. Может быть, это поможет кому-то другому.

ответ

1

«... только категории, которые имеют, товары, в которых есть активные объявления, являются ».

«... способ объединения этих трех запросов в один, так что первая функция Category-> find() извлекает все допустимые данные».

Чтобы получить данные и ограничить их в соответствии с полями связанных моделей, вы должны использовать CakePHP's JOIN.

Трудно ответить на ваш вопрос дальше, чем просто написать код для вас, так что дайте JOINs попробовать, затем вернитесь и задайте еще один конкретный вопрос, если у вас есть какие-либо проблемы с ним.

+0

Я добавил несколько соединений и, похоже, работает. Теперь есть способ выбрать отдельный, чтобы возвращался только один экземпляр категории? – tmartin314

+0

@whatshakin - попробуйте использовать 'GROUP BY' (или в Cake, это« группа »). – Dave