Ассоциации CakePHP multi-HABTM с нумерацией страниц

Для приложения электронной коммерции, которое я создаю, я использую CakePHP. Я создал базу данных, а затем испек свое приложение с помощью cake bake. Все мои модели правильно связаны следующим образом:

Product hasMany CategoryProduct,ImagesProduct

Category hasMany CategoryProduct

CategoryProduct belongsTo Product,Category

Image hasMany ImagesProduct

ImagesProduct belongsTo Product,Image

Я пытался разными способами получить разбивку на страницы продуктов, зависящих от category_id, но безуспешно. Мне удалось получить массив, который я хотел, с помощью $this->CategoryProducts->findByCategoryId($id), но я не могу использовать встроенный пагинатор CakePHP с результирующим массивом.

Может ли кто-нибудь сказать мне, как правильно сформулировать массив $options['joins'] для передачи функции разбиения на страницы, чтобы получить тот же результат, но с разбиением на страницы?

SQL для того, что я хочу сделать, будет примерно таким:

SELECT p . * , i.filename FROM products p LEFT JOIN ( category_products cp, categories c, images_products ip, images i ) ON ( cp.product_id = p.id AND c.id = cp.category_id AND c.id =2 AND ip.product_id = p.id AND ip.image_id = i.id )


person Andrei Coman    schedule 18.02.2011    source источник


Ответы (1)


Это вопрос, который некоторое время ставил меня в тупик. Вам не нужно напрямую связывать любую из ваших моделей соединения (CategoryProduct, ImagesProduct) с вашими моделями, если вы используете ассоциацию HABTM с CakePHP. cake bake возможно, неправильно уловил ассоциацию HABTM, если у вас были неправильные имена таблиц. Таблицы соединений должны быть categories_products и images_products, что сделает модели соединений CategoriesProduct и ImagesProduct.

В любом случае, следующее должно заставить вас фильтровать по категориям:

//in products_controller.php:

//Fake a HasOne association, setting the reset parameter to false since pagination
//requires two queries to complete (one for the count, one for the data)

$this->Product->bindModel(array(
    'hasOne' => array(
        'CategoriesProduct
    )
), false);

//Group by products since the HasOne will return multiple rows for each product

$options = array(
    'group' => 'Product.id',
    'conditions' => array(
        'CategoriesProduct.category_id' => $categories
    )
);

//To paginate the result:

$this->paginate = $options;
$products = $this->paginate();

В этом примере $categories может быть либо одним category_id, либо массивом, содержащим category_id (т.е. array('1', '2', '3')). Результатом будет «ИЛИ» категорий. Если вы хотите отфильтровать по условию типа «И», проверьте http://edblogs.cal.msu.edu/devteam/2011/02/08/cakephp-habtm-searches/.

Надеюсь это поможет.

person wreality    schedule 19.02.2011