2013-02-27 12 views
6

Ho un modello chiamato User che ha un Virtual field chiamato full_name. Quando accedo mio modello User in una query find(), è possibile impostare le condizioni sul mio campo virtuale senza alcun problema come questo:modello cakephp virtualFields non funziona via contiene

$user = $this->User->find('first', array(
    'recursive' => -1, 
    'conditions' => array(
     'User.full_name' => 'Bruce Thomas' 
    ) 
)); 

La query sopra di me tornerà con successo i dati per l'utente chiamato Bruce Thomas. Ma il problema sorge quando cerco di usare il mio modello per l'utente attraverso un altro modello tramite il comportamento contenibile in questo modo:

$user = $this->MyOtherModel->find('first', array(
    'contain' => array('User'), 
    'conditions' => array(
     'MyOtherModel.id' => $my_other_model_id 
     'User.full_name' => 'Bruce Thomas' 
    ) 
)); 

(Questo esempio di cui sopra presuppone che MyOtherModel ha un rapporto belongsTo con il mio modello MyOtherModel)

Il query sopra mi dà il seguente errore:

Warning (512): SQL Error: 1054: Unknown column 'User.full_name' in 'on clause' [CORE\cake\libs\model\datasources\dbo_source.php, line 681]

Qualsiasi aiuto su come posso fare questo per favore? Grazie

+0

si può aggiungere/set 'configure :: Write ('debug', 2),' in "app/config/core.php "e aggiungi l'elemento' ('sql_dump'); ?> 'nel tuo codice per controllare le query? –

+0

Si può copiare il risultato senza condizioni? –

risposta

10

Secondo la documentazione più recente CakePHP (per V2 in su), che è una limitazione di campi virtuali - this is what it says:

The implementation of virtualFields has a few limitations. First you cannot use virtualFields on associated models for conditions, order, or fields arrays. Doing so will generally result in an SQL error as the fields are not replaced by the ORM. This is because it difficult to estimate the depth at which an associated model might be found. A common workaround for this implementation issue is to copy virtualFields from one model to another at runtime when you need to access them:

$this->virtualFields['name'] = $this->Author->virtualFields['name']; 

o

$this->virtualFields += $this->Author->virtualFields; 

Maggiori dettagli qui : http://book.cakephp.org/2.0/en/models/virtual-fields.html - se hai intenzione di implementare le opzioni che suggeriscono (che sembrano abbastanza buone per me) dovresti dare un'occhiata alla sezione "Campi virtuali e alias del modello" per evitare scontri sul nome del campo (ad es. se si dispone di un campo chiamato full_name in due modelli e si tenta di eseguire una query che utilizza entrambi, si otterrà un errore SQL campo ambiguo; che viene evitato con alias).

+0

Non riesco a ottenere la funzione 'copia campi virtuali da un modello a un altro'. Come applicheresti questo alla mia situazione attuale? Non sembra funzionare – user765368

+0

ok capito, grazie – user765368

+0

Sembra che tu l'abbia già fatto, ma dovresti fare qualcosa come '$ this-> MyOtherModel-> virtualFields ['full_name'] = $ this-> User-> virtualFields ['full_name'] 'prima di emettere il comando 'trova'. –

1

nel modello è necessario creare campo virtuale usando il codice qui sotto:

public $virtualFields = array(
    'full_name' => 'CONCAT(YourModelName.first_name, " ", YourModelName.last_name)' 

);

Ora è sufficiente chiamare il codice qui sotto Interni Stato del controller di array:

$condition=array($this->YourModelName->virtualFields['your_virtual_field_name'].' LIKE "%'.$YourSearchKeyword.'%"');