CakePHP $this-> paginate с пользовательскими параметрами JOIN и фильтрацией
Я работаю с параметрами paginations cakephp в течение 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- > paginations игнорируют каждый $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'][]
.
Ответы
Ответ 1
Это старый вопрос, поэтому я просто рассмотрю, как сделать JOIN в paginate для других, которые пришли сюда из Google, как я. Здесь пример кода из Widget Controller, соединяющий Widget.user_id FK с столбцом 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
Я не уверен, нужны ли вам эти [] - попробуйте сделать это:
$this->paginate['conditions']['Reservation.pagamento_verificato'] = 'SI';
Ответ 3
Я использую условия, когда я вызываю метод paginate.
$this->paginate($conditions)
Это работает хорошо для меня, я надеюсь, что это сработает для вас!
Если вы установили предыдущие параметры, вы можете использовать:
$this->paginate(null,$conditions)
Ответ 4
Это может помочь кому-то...
Вот как я сделал сложные объединения с разбивкой на страницы в cakephp.
$parsedConditions['`Assessment`.`showme`'] = 1;
$parsedConditions['`Assessment`.`recruiter_id`'] = $user_id;
$this->paginate = array(
'conditions' => array($parsedConditions ),
'joins' => array(
array(
'alias' => 'UserTest',
'table' => 'user_tests',
'type' => 'LEFT',
'conditions' => '`UserTest`.`user_id` = `Assessment`.`testuser_id`'
),
array(
'alias' => 'RecruiterUser',
'table' => 'users',
'type' => 'LEFT',
'conditions' => '`Assessment`.`recruiter_id` = `RecruiterUser`.`id`'
)
,
array(
'alias' => 'OwnerUser',
'table' => 'users',
'type' => 'LEFT',
'conditions' => '`Assessment`.`owner_id` = `OwnerUser`.`id`'
)
),
'fields' => array('Assessment.id', 'Assessment.recruiter_id', 'Assessment.owner_id', 'Assessment.master_id', 'Assessment.title', 'Assessment.status', 'Assessment.setuptype','Assessment.linkkey', 'Assessment.review', 'Assessment.testuser_email', 'Assessment.counttype_2', 'Assessment.bookedtime', 'Assessment.textqstatus', 'Assessment.overallperc', 'UserTest.user_id', 'UserTest.fname', 'UserTest.lname', 'RecruiterUser.company_name', 'OwnerUser.company_name'),
'limit' => $limit,
'order'=> array('Assessment.endtime' => 'desc')
);