Как получить только продукты с изображениями в CakePhp - PullRequest
0 голосов
/ 11 января 2012
<?php
class Product extends AppModel {
    var $name = 'Product';

    //The Associations below have been created with all possible keys, those that are not needed can be removed

    var $belongsTo = array(
        'Category' => array(
            'className' => 'Category',
            'foreignKey' => 'category_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'Brand'
    );


    var $hasOne = array(
        'PhotoSmall' => array(
            'className' => 'Photo',
            'foreignKey' => 'product_id',
            'dependent' => true,
            'conditions' => 'PhotoSmall.tipo = "small"',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        ),
    );

    var $hasMany = array(
        'PhotoBig' => array(
            'className' => 'Photo',
            'foreignKey' => 'product_id',
            'dependent' => true,
            'conditions' => 'PhotoBig.tipo = "big"',
            'fields' => '',
            'order' => 'PhotoBig.order',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        ),
        'Rating' => array(
            'className' => 'Rating',
            'foreignKey' => 'product_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );

Мне нужны все мои находки (кроме области администратора), чтобы получать только продукты с изображениями.

В случае PhotoSmall это просто, я могу выполнить PhotoSmall.id IS NOT NULL в условиипотому что CakePhp генерирует левое соединение, но я не могу найти способ требовать хотя бы минимума для PhotoBig, потому что CakePhp делает два запроса, чтобы вернуть его результаты.PhotoSmall и, по крайней мере, один PhotoBig общесистемный (за исключением административной части сайта), решение должно работать с нумерацией страниц CakePhp

Я попробовал следующий код без успеха, он только возвращаетданные о продукте, а не фотографии:

$this->Product->recursive = -1;
$conditions = array('Product.category_id'=> $cats);
$joins = array(
    array('table' => 'photos',
        'alias' => 'PhotoBig',
        'type' => 'INNER',
        'conditions' => array(
            'Product.id = PhotoBig.product_id',
        )
    ),
    array('table' => 'photos',
        'alias' => 'PhotoSmall',
        'type' => 'INNER',
        'conditions' => array(
            'Product.id = PhotoBig.product_id',
        )
    )
);
$this->paginate = array(
    'limit' => 12,
    'conditions' => $conditions,
    'joins' => $joins,
);

Ответы [ 2 ]

0 голосов
/ 12 января 2012

Ну, во-первых, вы устанавливаете рекурсивное значение -1, которое должно просто давать вам данные о Продукте независимо от того, какой тип поиска вы делаете.

Почему бы вам не выполнить условие И в находке в Продуктемодель выглядит так:

    $this->Product->find('all', array('recursive' => 1, 'conditions' => array(
    "NOT" => array('PhotoSmall.id' => NULL, 'PhotoBig.id' => NULL))));

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

0 голосов
/ 12 января 2012

вам нужно дополнительно использовать: содержать - по крайней мере, это сработало для меня (из-за вашей рекурсии = -1):

'contain' => array('PhotoSmall', 'PhotoBig'),

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

Вы используете сдерживаемое поведение?было бы самым простым решением.если нет, попробуйте установить рекурсивное значение 0 или 1.

PS: и ваш второй псевдоним неверен в «условиях» (там должен быть PhotoSmall).

...