2009-10-19 9 views
8

In che modo unbindModel si presenta nella torta?chiamata unbindModel in CakePhp. Come funziona?

$this->User->unbindModel(array('hasAndBelongsToMany' => array('Friend'))); 

Ho scritto questo all'inizio di una funzione. Ma continua a chiedere il modello "Amico". C'è stata una chiamata a paginare() nel mezzo della funzione. Quindi pensavo che l'impaginatore potesse generare le query.

Ho aggiunto una chiamata unbindModel poco prima di impaginare e ora funziona.

$this->User->unbindModel(array('hasAndBelongsToMany' => array('Friend'))); 
$user = $this->paginate("User", array("User.first_name LIKE" => $user["User"]["first_name"])); 

DoesindindModel separa ogni query? o si disfa durante l'intera chiamata di funzione?

risposta

12

From the manual:

togliendo o aggiungendo le associazioni che utilizzano bind- e unbindModel() funziona solo per la prossima operazione modello di a meno che il secondo parametro è stato impostato su false. Se il secondo parametro è stato impostato su false, il binding rimane attivo per il resto della richiesta.

In altre parole, dopo aver paginate() o find() o fare qualsiasi altra cosa con il modello, il non vincolante sarà invertito.

+0

in questo caso è una buona pratica di svincolare in questo modo ?? 'unset ($ this-> User-> hasAndBelongsToMany ['Friend])' – RSK

+1

@RSK Che non farebbe nulla, o rompere le cose in modo orribile. Non vorrei provare in entrambi i casi. – deceze

+0

http://stackoverflow.com/questions/3707859/cakephp-validating-a-login-form-using-validate-array puoi rispondere per questo – RSK

3

Ebbene, nella mia esperienza con slega, posso dire Impagina sempre fare 2 querys uno per contare il totale e il secondo per la matrice risultato

unbind distruggere solo una volta il tempo del rapporto e yea è necessario estendere questa regola per distruggere due o più volte, quindi è necessario impostare TRUE Credo che a persistere questa regola:

$this->User->unbindModel(array('hasAndBelongsToMany' => array('Friend')), true); 
+1

grazie per questa risposta –

0

provate questo:

$this->Leader->find('all'); 

// Let's remove the hasMany... 
$this->Leader->unbindModel(
    array('hasMany' => array('Follower')) 
); 

// Now using a find function will return 
// Leaders, with no Followers 
$this->Leader->find('all'); 

// NOTE: unbindModel only affects the very next 
// find function. An additional find call will use 
// the configured association information. 

// We've already used find('all') after unbindModel(), 
// so this will fetch Leaders with associated 
// Followers once again... 
$this->Leader->find('all'); 
+0

ho cambiato la formattazione del codice per favore controlla – devpro