Cakephp $ this-> paginate с пользовательскими JOIN и опциями фильтрации - PullRequest
10 голосов
/ 20 апреля 2011

Я работаю с вариантами разбивки тортов в течение 2 дней. Мне нужно сделать INNER Joins, чтобы перечислить несколько полей, но мне приходится иметь дело с поиском, чтобы отфильтровать результаты. Это часть кода, в которой я имею дело с параметрами поиска по $this->passedArgs

function crediti() {

    if(isset($this->passedArgs['Search.cognome'])) {
                debug($this->passedArgs);

                $this->paginate['conditions'][]['Member.cognome LIKE'] = str_replace('*','%',$this->passedArgs['Search.cognome']);

        }
        if(isset($this->passedArgs['Search.nome'])) {
                $this->paginate['conditions'][]['Member.nome LIKE'] = str_replace('*','%',$this->passedArgs['Search.nome']);

        }

и после

$this->paginate = array(

            'joins' => array(array('table'=> 'reservations',
            'type' => 'INNER',
            'alias' => 'Reservation',
            'conditions' => array('Reservation.member_id = Member.id','Member.totcrediti > 0' ))),
            'limit' => 10);
        $this->Member->recursive = -1;
        $this->paginate['conditions'][]['Reservation.pagamento_verificato'] = 'SI';
        $this->paginate['fields'] = array('DISTINCT Member.id','Member.nome','Member.cognome','Member.totcrediti');
        $members = $this->paginate('Member');
        $this->set(compact('members'));

INNER JOIN работает хорошо, но $ this-> pagination игнорирует каждый $this->paginate['conditions'][] by $this->passedArgs, и я не могу понять, как я могу это решить. Нет запроса в отладке, только оригинал INNER JOIN. Может кто-нибудь мне поможет? Большое спасибо

Обновление: Не повезло об этом. Я имел дело с этой частью кода в течение многих часов. Если я использую

if(isset($this->passedArgs['Search.cognome'])) {
                    $this->paginate['conditions'][]['Member.cognome LIKE'] = str_replace('*','%',$this->passedArgs['Search.cognome']);

            }
$this->paginate['conditions'][]['Member.sospeso'] = 'SI';
        $this->Member->recursive = 0;
        $this->paginate['fields'] = array(
            'Member.id','Member.nome','Member.cognome','Member.codice_fiscale','Member.sesso','Member.region_id',
            'Member.district_id','Member.city_id','Member.date','Member.sospeso','Region.name','District.name','City.name');
        $sospesi = $this->paginate('Member');

все идет хорошо, и после отладки я получаю первое условие и условия от $this->paginate['conditions'][]['Member.cognome LIKE'], как вы можете видеть массив $this->passedArgs

Array
(
    [Search.cognome] => aiello
)

Array $this->paginate['conditions'][]
(
    [0] => Array
        (
            [Member.cognome LIKE] => aiello
        )

    [1] => Array
        (
            [Member.sospeso] => NO
        )

Но, если я напишу соединения с paginate, $this->paginate['conditions'][] проигнорирует все вещи и выдаст мне отладку, просто $this->paginate['conditions'][]['Reservation.pagamento_verificato'] = 'SI'; Еще немного информации. Если я положу все вещи, связанные с $this->paginate['conditions'][]['Reservation.pagamento_verificato'] = 'SI'; до $this->paginate JOIN ничего не будет в $this->paginate['conditions'][].

Ответы [ 4 ]

15 голосов
/ 23 мая 2012

Это старый вопрос, поэтому я просто расскажу, как сделать JOIN в пагинации для тех, кто попал сюда из Google, как я.Вот пример кода из контроллера виджета, объединяющий FK Widget.user_id со столбцом User.id, показывающий только текущего пользователя (в условиях):

// Limit widgets shown to only those owned by the user.
$this->paginate = array(
    'conditions' => array('User.id' => $this->Auth->user('id')),
    'joins' => array(
        array(
            'alias' => 'User',
            'table' => 'users',
            'type' => 'INNER',
            'conditions' => '`User`.`id` = `Widget`.`user_id`'
        )
    ),
    'limit' => 20,
    'order' => array(
        'created' => 'desc'
    )
);
$this->set( 'widgets', $this->paginate( $this->Widget ) );

Это делает запрос похожим на:

SELECT widgets.* FROM widgets 
INNER JOIN users ON widgets.user_id = users.id 
WHERE users.id = {current user id}

И все же разбит на страницы.

2 голосов
/ 20 апреля 2011

Я не уверен, что вам это нужно [] - попробуйте сделать следующее:

$this->paginate['conditions']['Reservation.pagamento_verificato'] = 'SI';
1 голос
/ 03 мая 2016

Это может быть полной помощью кому-то .... Вот как я делал сложные объединения с нумерацией страниц в cakephp.

1 голос
/ 30 декабря 2011

Я использую условия, когда вызываю метод paginate.

$this->paginate($conditions)

Это работает нормально для меня, я надеюсь, что это работает для вас!

Если вы установили предыдущие параметры, вы можетеиспользование:

$this->paginate(null,$conditions)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...