Лимит HABTM, содержащийся в CakePHP

Согласно второму предложению раздела Containable Behavior Cookbook, contain() поддерживает предложение limit.

Новым дополнением к ядру CakePHP 1.2 является ContainableBehavior. Такое поведение модели позволяет фильтровать и ограничивать операции поиска модели.

Я использую CakePHP 2.5.

У меня есть две модели: продукт и категория (отношение HABTM).

Отношения для продукта:

public $hasAndBelongsToMany = array(
    'Category' => array(
        'className' => 'Category',
        'joinTable' => 'categories_products',
        'foreignKey' => 'product_id',
        'associationForeignKey' => 'category_id',
    ),
);

Отношения для категории:

public $hasAndBelongsToMany = array(
    'Product' => array(
        'className' => 'Product',
        'joinTable' => 'categories_products',
        'foreignKey' => 'category_id',
        'associationForeignKey' => 'product_id',
    ),
);

Я пытаюсь использовать limit следующим образом:

$cats = $this->Category->find('all', array(
    'fields' => array(
        'id',
        'parent_id'
    ),
    'contain' => array(
        'Product' => array(
            'fields' => array(
                'id',
                'name',
            ),
            'limit' => 3,
            'order' => array('created DESC'),
        ),
    ),
));

В результате выбрано всего 3 продукта. Не 3 продукта в категории. Контейнерное поведение правильно загружено. Как мне получить 3 продукта в каждой категории?


person user2511309    schedule 12.08.2014    source источник


Ответы (1)


К сожалению, вы не можете использовать 'limit' в отношениях HABTM. Из соображений производительности CakePHP создает один запрос для получения всех записей HABTM, которые позже рекурсивно назначаются ключу родительской записи в выходном массиве.

Если вы примените предложение LIMIT, это приведет к тому, что CakePHP будет получать только ограниченное количество связанных продуктов, как вы заметили.

Раздел HABTM в Cookbook, вероятно, следует изменить, чтобы удалить 'limit' в качестве опции или уточнить его предполагаемое использование.

Смотрите этот ответ для получения дополнительной информации:

person Inigo Flores    schedule 09.01.2016