2011-01-29 2 views
3

Я играю с базой данных кавычек, относящейся к лыжной трассе, которую я запускаю. Я пытаюсь перечислить кавычки, но сортировать по человеку, который сказал цитату, и изо всех сил пытаюсь заставить помощника по страницам сделать это.cakephp - сортировка по ассоциации второго уровня в paginate

У меня есть четыре соответствующих таблицы.

цитаты, поездки, люди и посещаемость. Посещаемость - это, по сути, таблица соединений для людей и поездок.

Отношения заключаются в следующем:

Участники belongsTo Person hasMany Посещаемость
Посещаемость belongsTo Маршрутный hasMany Посещаемость
Посещаемость hasMany Quote принадлежит посещаемости

В QuotesController я использую Containable для извлечения полей из цитирую, вместе с соответствующим посещаемости и полей от Поездки и Лица, связанных с этим Посещением.

function index() { 
    $this->Quote->recursive = 0; 
    $this->paginate['Quote'] = array(
    'contain' => array('Attendance.Person', 'Attendance.Trip')); 
    $this->set('quotes', $this->paginate()); 
} 

Это, кажется, работает хорошо, и с точки зрения, я могу повторить из

foreach ($quotes as $quote) { 
echo $quote['Attendance']['Person']['first_name']; 
} 

без каких-либо проблем.

То, что я не могу работать в доступе к/с использованием той же переменной в качестве поля сортировки в постраничной

echo $this->Paginator->sort('Name', 'Attendance.Person.first_name'); 

или

echo $this->Paginator->sort('Location', 'Attendance.Trip.location'); 

не работает. Кажется, что-то вроде, но я не уверен, что.

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

Array 
(
    [0] => Array 
      (
       [Quote] => Array 
        (
         [id] => 1 
         [attendance_id] => 15 
         [quote_text] => Hello 

      ) 

       [Attendance] => Array 
      (
         [id] => 15 
         [person_id] => 2 
         [trip_id] => 7 
         [Person] => Array 
          (
           [id] => 2 
           [first_name] => John 
           [last_name] => Smith 

           ) 

         [Trip] => Array 
          (
           [id] => 7 
           [location] => La Plagne 
           [year] => 2000 
           [modified] => 
         ) 

       ) 

     ) 

Я был бы очень признателен, если кто-то мог предположить, как я мог бы быть в состоянии сортировать по first_name на человека, связанного с котировке. Я подозреваю, что мой синтаксис неверен, но я не смог найти ответ. Разве это невозможно сортировать по ассоциации второго уровня таким образом?

Я в значительной степени новенький с cakephp, поэтому, пожалуйста, будьте осторожны.

Большое спасибо за внимание.

+1

Вы решили решить эту проблему? Я столкнулся с тем же. Приветствия. – Nicolas

+0

та же проблема, как справиться с этим – baur79

+0

Облицовка одной и той же проблемы, как ее решить? – Deepak

ответ

1

У меня была аналогичная проблема некоторое время назад. Не с чем. Попробуйте поместить связанную таблицу в другой массив.

echo $this->Paginator->sort('Name', 'Attendance.Person.first_name'); 

изменение:

echo $this->Paginator->sort('Name', array('Attendance' => 'Person.first_name')); 

Надеется, что это помогает

+0

Спасибо, Ник, к сожалению, это не сработало. Он создает ссылку, но когда я нажимаю на нее, она не сортируется по имени. Нужно ли мне что-то менять в контроллере или модели? –

0

я также ищу помощи с этим.

До сих пор я обнаружил, что вы можете сортировать ассоциации с несколькими уровнями в параметрах разбивки на контроллер после использования подключаемого плагина https://github.com/Terr/linkable. , но он ломается, когда вы пытаетесь сортировать фигуру в представлении. Я использую контроллер для вырезки журналов. каждая обрезка относится к проблеме, и каждая проблема относится к публикации.

$this->paginate = array(
     "recursive"=>0, 
     "link"=>array("Issue"=>array("Publication")), 
     "order"=>array("Publication.name"=>"ASC", 
     "limit"=>10); 

после отладки $ this-> paginator-> params-> paging-> Clipping в представлении, вы можете увидеть, что сортировка описана в двух разных местах, "Defaults" и "Параметры". информация о сортировке должна присутствовать как в том, так и в том, чтобы она работала в представлении. здесь после установки порядка в контроллере:

[Clipping] => Array 
      (
       [page] => 1 
       [current] => 10 
       [count] => 6685 
       [prevPage] => 
       [nextPage] => 1 
       [pageCount] => 669 
       [defaults] => Array 
        (
         [limit] => 10 
         [step] => 1 
         [recursive] => 0 
         [link] => Array 
          (
           [Issue] => Array 
            (
             [0] => Publication 
            ) 

          ) 

         [order] => Array 
          (
           [Publication.name] => ASC 
          ) 

         [conditions] => Array 
          (
          ) 

        ) 

       [options] => Array 
        (
         [page] => 1 
         [limit] => 10 
         [recursive] => 0 
         [link] => Array 
          (
           [Issue] => Array 
            (
             [0] => Publication 
            ) 

          ) 

         [order] => Array 
          (
           [Publication.name] => ASC 
          ) 

         [conditions] => Array 
          (
          ) 

        ) 

      ) 

и вот после того, как с помощью $ this-> paginator-> сортировки ("Публикация", "Publication.name") ;.

Обратите внимание, что массив параметров пуст.

[Clipping] => Array 
      (
       [page] => 1 
       [current] => 10 
       [count] => 6685 
       [prevPage] => 
       [nextPage] => 1 
       [pageCount] => 669 
       [defaults] => Array 
        (
         [limit] => 10 
         [step] => 1 
         [recursive] => 0 
         [link] => Array 
          (
           [Issue] => Array 
            (
             [0] => Publication 
            ) 

          ) 

         [order] => Array 
          (
           [Publication.name] => DESC 
          ) 

         [conditions] => Array 
          (
          ) 

        ) 

       [options] => Array 
        (
         [page] => 1 
         [limit] => 10 
         [recursive] => 0 
         [link] => Array 
          (
           [Issue] => Array 
            (
             [0] => Publication 
            ) 

          ) 

         [order] => Array 
          (
          ) 

         [conditions] => Array 
          (
          ) 

        ) 

действительно ли нужно изменить класс paginator, чтобы сделать эту работу?


UPDATE:


я выяснил проблему: в основной контроллер торт постраничной навигации сливает по умолчанию и опции для создания запроса найти. , но массив параметров пуст при использовании связывания для сортировки. потому что опции перечислены после значения по умолчанию, он переопределяет значение по умолчанию, а пустой массив заменяет набор параметров по умолчанию. Решения этой проблемы расширяет функцию постраничной внутри app_controller.php охрану и снятие значения заказа опций массива, если он пуст: (линия 1 172 в торте/Libs/контроллер/controller.php)

if(empty($options["order"])){ 
unset($options["order"]); 
} 

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

0

На CakePHP 3 эту проблему можно решить, добавив 'sortWhitelist' params к $this->paginate на ваш контроллер.

$this->paginate = [ 
    // ... 
    'sortWhitelist' => ['id', 'status', 'Attendance.Person.first_name'] 
]; 

И тогда, на ваш взгляд:

echo $this->Paginator->sort('Name', 'Attendance.Person.first_name'); 

Это отмечено in the docs:

Эта опция необходима, если вы хотите отсортировать по любой связанных данных, или вычисляемые поля, которые могут в вашу форму подкатегории:

Однако t шляпу можно было легко упустить усталыми глазами, поэтому надеюсь, что это поможет кому-то!

Смежные вопросы