2011-04-20 15 views
10

2 gün boyunca cakephp pagations seçenekleri ile çalışıyorum. Birkaç alanı listelemek için INNER Birleştirme yapmam gerekiyor, ancak sonuçları filtrelemek için arama ile uğraşmak zorundayım. Bu benim $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']); 

     } 

tarafından ve

$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')); 

İÇ iyi işler JOIN sonra arama seçenekleri ile başa hangi kod bölümünün, ama $ this-> paginations her $this->paginate['conditions'][] by $this->passedArgs görmezden gelip ben fikir sahibi olamaz Nasıl çalışabilirim. Hatalı sorguda sorgu yok, sadece orijinal INNER JOIN. Birisi bana yardımcı olabilir mi? Thank you very

Güncelleme: Bu konuda bir şans yok. Birçok saat boyunca bu kod parçası ile uğraşıyorum. Ben

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'); 

her şey iyi gider kullanıyorum ve birleştirmeler yazarsam debug'daki Seni dizi $this->passedArgs

Array 
(
    [Search.cognome] => aiello 
) 

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

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

görebileceğiniz gibi, birinci koşul ve $this->paginate['conditions'][]['Member.cognome LIKE'] gelen koşullarını almak Ama olursa paginate ile, $this->paginate['conditions'][] tüm şeyleri göz ardı eder ve hata ayıklamadan bana verir, yalnızca $this->paginate['conditions'][]['Reservation.pagamento_verificato'] = 'SI'; Başka bir bilgi. $this->paginate['conditions'][]['Reservation.pagamento_verificato'] = 'SI'; ile ilgili tüm bilgileri $this->paginate JOIN'dan önce koyarsam hiçbir şey $this->paginate['conditions'][] içinde olmayacaktır. Ben yöntemini sayfalandırmak çağırdığınızda

$this->paginate['conditions']['Reservation.pagamento_verificato'] = 'SI'; 
+0

: CakePHP'nin 2.3.4 http://stackoverflow.com/questions/13645296/cakephp-paginate-conditions-on-join-table/ 16789816 # 16789816 –

cevap

2

emin değilim.

$this->paginate($conditions) 

Bu işlem benim için tamam, umarım sizin için çalışır!

$this->paginate(null,$conditions) 
1

şartlarım kullanın: sadece bunu deneyin - o [] gerekiyorsa

15

Bu eski bir sorudur, bu yüzden sadece böyle Google'dan burada var diğerleri için bir sayfalandırmak içinde JOIN nasıl inceleyeceğiz: Daha önceki params setted varsa

, kullanmak olabilir Yaptım.

SELECT widgets.* FROM widgets 
INNER JOIN users ON widgets.user_id = users.id 
WHERE users.id = {current 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)); 

Bu benzer bir sorgu yapar: Burada Widget Kontrol örnek kodu, yalnızca (koşullarda) geçerli kullanıcı gösteren bir User.id sütununa bir Widget.user_id FK katılmadan, var

Ve hala paginatlar.

+1

Ayrıca, 'birleştirmeler' seçeneğinde bulabildiğim tek belge, CakePHP kodunun içinde, Model.find() için doc bloğunda yer almaktadır. –

+0

Bu çalışır. Ayrıca $ this-> paginate ('Widget'); ' – Bob

+1

Pastada kötü düşünülmüş paginate() işlevini bulabilirim. Bu cevap için teşekkürler - Bu soruna bir çözüm arıyordum. – Michaelkay

1

Bu, birisine tam yardımcı olabilir .... Bu nasıl cakephp içinde sayfalandırma ile karmaşık birleşimler yaptım.Bu burada bir çözüm yok

$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') 
    ); 
+0

Nasıl düzgün ve basit bir 'VEYA' yapılacağını nasıl anlayamadık ?, folklorik ifadenin nerede olduğu WHERE ('Assessment'.'recruiter_id' = '. $ User_id.' OR' Assessment'.'owner_id' = '. $ user_id. ') – gabrielkolbe