CakePHP Пагинация с моделью третьего уровня - PullRequest
0 голосов
/ 22 марта 2011

У меня есть следующая модель в приложении CakePHP 1.2:

class Equipment extends AppModel {

      var $name = 'Equipment';
       var $belongsTo=array("City");
   ///
}

И модель моего города выглядит так:

class City extends AppModel {

     var $name = 'City';
     var $belongsTo=array("State");
  ///
}

Я не делаю ничего особенного в EquipmentController - просто получаю все оборудование с помощью Paginator.

Поэтому, когда я пытаюсь реализовать разбиение на страницы в виде, подобном этому:

  <th><?php echo $paginator->sort('Equipment',"Equipment.name");?></th>
  <th><?php echo $paginator->sort('City',"City.name");?></th>
  <th><?php echo $paginator->sort('State',"State.name");?></th>  

Я могу сортировать по названию оборудования и названию города, но сортировка по названию штата дает мне отсортированный список по City.id, а не по State.name. Я пытался использовать City.State.name, но это дало мне тот же результат. Я изменил «рекурсивное» свойство в обеих моделях на «2» с тем же результатом.

               );

Почему это не работает? Кто-нибудь может дать мне обходной путь или показать, что я делаю не так?

РЕДАКТИРОВАТЬ Я забыл сказать, что я пробовал Containable, который тоже не работал. Вот как я это настроил:

   $this->paginate = array(
  "conditions" => array("Equipment.expire_time >"=>date("Y-m-d H:i:s"),
        "Equipment.is_active"=>true
                        ),
  'limit' => 25,        
  'order' => array(
         'Equipment.available_time' => 'asc',

       ),
      'contain'=>array(
             "City"=>array(
               "fields"=>array("id","name"),
               "State"=>array("fields"=>"name")),

              )

И я вижу, что правильные запросы выполняются, но все еще могут сортировать по состоянию

1 Ответ

0 голосов
/ 23 марта 2011

Cake не объединяет таблицы все время, как обычно делает какой-то SQL, вместо этого он выполняет выборку, а затем выполняет поиск по строкам из одного запроса и выполняет поиск для каждой итерации цикла.

Установите что-то вроде отладочного комплекта, чтобы вы могли видеть, что делается в SQL.Если это так, используйте поиск в Google для «глубокого поиска cakephp», для этого есть несколько методов, один из которых - принудительное соединение hasOne для отношений.

Возможно, Cake загружает экземпляр AppModelсоответствующей модели.Вы можете проверить это с помощью метода pho get_class iirc.Убедитесь, что ничто не является моделью приложения, это должен быть фактический класс, который вы создали.

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

Редактировать ... Как отфильтровать глубокие ассоциации в CakePHP

...