Как ограничить количество строк, извлекаемых из связанной таблицы в CakePHP? - PullRequest
0 голосов
/ 01 ноября 2009

Предполагается две таблицы базы данных: Funds и Prices, в которых Funds hasMany Prices.

Что я хотел сделать, так это получить последние 15 цен определенного фонда по определенному сценарию. Есть ли в CakePHP средство для выполнения вызова $this->Fund->find('all'), который позволил бы мне ограничить число строк, которые можно извлечь из связанной таблицы Price?

Обратите внимание, что я предпочитаю не устанавливать параметр 'limit' в переменной $hasMany модели Fund.

Примечание к принятому ответу [2 ноября]:

В ответе Джейсона, который я принял , я лично выбрал решение bindModel, так как я чувствовал, что, несмотря на то, что я чувствовал себя немного "хак-у", это предвещает мне гораздо больше, чем когда-либо -off переопределить для привязок модели по умолчанию.

Код, который я использовал, выглядит следующим образом:

$this->Fund->bindModel(array(
    'hasMany' => array(
        'Price' => array(
            'limit' => 15,
            'order' => 'Price.date DESC'
        )
    )
);

Нет unbindModel необходимо. Дополнительную информацию можно прочитать из «3.7.6.6 Создание и уничтожение ассоциаций на лету» в руководстве CakePHP.

Ответы [ 3 ]

2 голосов
/ 03 ноября 2009

Вы можете использовать поведение Containable для легкого выполнения этого.

  • в вашей модели AppModel или Fund добавьте:

    var $actsAs = array('Containable');
  • , затем в вашем контроллере вы можете добавить опцию «содержать» в вашу находку («все»):

    $this->Fund->find('all', array(
        'contain' => array(
            'Price' => array(
                'limit' => 15,
                'order' => 'Price.date DESC')
    )));
    

Более подробная информация доступна в книге: http://book.cakephp.org/view/474/Containable

0 голосов
/ 02 ноября 2009

Ваш $ this-> Model-> find ('all') может содержать условия. то есть.

$ this-> Model-> find ('all', массив ('condition' => array ('Model.field' => $ value), 'limit' => 15));

Для получения дополнительной информации проверьте документы на торт.

Получение ваших данных

0 голосов
/ 01 ноября 2009

Насколько я понимаю, вы не хотите устанавливать статическое ограничение в модели. Если вы хотите использовать ассоциацию hasMany, на самом деле я не знаю другого способа, кроме как изменить это ограничение тем или иным способом.

Вот несколько способов динамически изменить его:

  1. Вы можете изменить лимит с помощью вызова Funds-> bindModel (). (Для этого может потребоваться сначала unbindModel (), но я точно не помню)
  2. Вы можете добавить функцию в фонды, чтобы изменить лимит напрямую. (См. Пример ниже.)
  3. Если вы чувствуете себя амбициозно, вы можете написать Поведение, чтобы добавить функциональность для его указания на каждый вызов find (), аналогично Поведение Containable .

Пример для # 2

<?php
function setPriceLimit($limit = 10) {
     // Assuming the association is 'Price'
     $this->hasMany['Price']['limit'] = $limit;
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...