cakephp - сортировка по ассоциации второго уровня в paginate - PullRequest
3 голосов
/ 29 января 2011

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

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

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

Отношения таковы:

Посещаемость принадлежит человеку, который имеет большое количество посещений
Посещаемость принадлежит к поездке, имеет большое количество посещений
Посещаемость имеет много цитат и принадлежит посещаемости

В контроллере QuotesController я используюableable для извлечения полей из Quote вместе с соответствующей посещаемостью и полями из Trip и Person, связанной с этой посещаемостью.

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'];
}

.

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

 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] => 
                         )

                 )

         )

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

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

Заранее большое спасибо.

Ответы [ 3 ]

1 голос
/ 30 января 2011

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

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

изменить на:

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

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

0 голосов
/ 28 августа 2017

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

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

И затем, по вашему мнению:

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

Thisотмечен в документах :

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

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

0 голосов
/ 11 декабря 2011

Мне также нужна помощь в этом.

До сих пор я обнаружил, что вы можете сортировать многоуровневые ассоциации в параметрах пагинации контроллера после использования подключаемого плагина 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 в представлении вы можете видеть, что сортировкаописано в двух отдельных местах, «по умолчанию» и «опции».информация о сортировке должна присутствовать в обоих, чтобы она работала в представлении.вот после установки порядка в контроллере:

[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-> sort ("Publication", "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 для этой работы?


ОБНОВЛЕНИЕ:


я обнаружил проблему: в пагинаторе основного торта контроллер объединяет настройки по умолчанию и опции для создания запроса поиска.но массив параметров пуст при использовании linkable для сортировки.Поскольку параметры перечислены после значения по умолчанию, он переопределяет значение по умолчанию, а пустой массив заменяет массив параметров по умолчанию.Решением этой проблемы является расширение функции paginate внутри app_controller.php и сброс значения значения в массиве параметров, если оно пустое: (строка 1172 в cake / libs / controller / controller.php)

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

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

...