Cakephp $ this-> paginate,带有自定义JOIN和过滤选项

n4t*_*han 10 cakephp

我一直在使用cakephp paginations选项2天.我需要创建一个INNER联接列出几个字段,但我必须处理搜索以过滤结果.这是我处理搜索选项的代码的一部分$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']);

        }
Run Code Online (Sandbox Code Playgroud)

之后

$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'));
Run Code Online (Sandbox Code Playgroud)

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');
Run Code Online (Sandbox Code Playgroud)

一切顺利,从调试我收到第一个条件和条件$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
        )
Run Code Online (Sandbox Code Playgroud)

但是,如果我用paginate编写连接,$this->paginate['conditions'][]将忽略所有的东西,并从调试中给我,只是 $this->paginate['conditions'][]['Reservation.pagamento_verificato'] = 'SI'; 另一点信息.如果我把所有的东西放在$this->paginate['conditions'][]['Reservation.pagamento_verificato'] = 'SI'; 之前处理, 那么$this->paginate JOIN什么都不会$this->paginate['conditions'][].

Dav*_*cea 15

这是一个老问题,所以我只会回顾一下如何在Google的分页中加入JOIN,就像我这样从谷歌到这里的人一样.这是来自Widget控制器的示例代码,将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 ) );
Run Code Online (Sandbox Code Playgroud)

这使得查询类似于:

SELECT widgets.* FROM widgets 
INNER JOIN users ON widgets.user_id = users.id 
WHERE users.id = {current user id}
Run Code Online (Sandbox Code Playgroud)

仍然是分页.


and*_*ers 2

我不确定你是否需要那些 [] - 尝试这样做:

$this->paginate['conditions']['Reservation.pagamento_verificato'] = 'SI';
Run Code Online (Sandbox Code Playgroud)