CakePHP multi-HABTM ассоциации с нумерацией страниц - PullRequest
0 голосов
/ 18 февраля 2011

Для приложения для электронной коммерции, которое я создаю, я использую 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), но я не могу использовать встроенный paginator из cakePHP с результирующим массивом.

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

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 )

1 Ответ

1 голос
/ 19 февраля 2011

Это вопрос, который озадачил меня довольно давно.Вам не нужно связывать ни одну из ваших моделей соединения (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();

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

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

...