2012-02-19 17 views
6

Sto avendo momento molto difficile selezionare i nomi utente di tutti i messaggi nel blog demo data in Yii ..Yii cdbcriteria selezionare le colonne di una relazione

autore è relazione di classe post con utente ...

$criteria = new CDbCriteria; 
$criteria->with='author'; 
$criteria->select='author.username'; 
$dataProvider=new CActiveDataProvider('Post', array(
    'criteria' => $criteria, 
)); 
var_dump($dataProvider->getData()); 

Errore:

record attivo "post" sta cercando di selezionare una colonna non valido "author.username". Nota, la colonna deve esistere nella tabella o essere un'espressione con alias.

risposta

8

what with does is eager loading ..that means the relation's data will also loaded from database alongwith, and when when u'll call the relation, there won't be a actual query..

What select does is it selects it from database and maps it to model variable..

Ora nel tuo caso ciò che sta accadendo è che si sta cercando di scrivere colonna di qualche relazione a selezionare, che sarà lì in selezionare anche senza scriverlo, ma dato che non esiste una variabile corrispondente per mappare questo valore yii sta generando un errore ..

Quindi, per prima cosa, se è necessario il nome utente di auther in risposta, è possibile ottenerlo per chiamata di relazione, che non sarà un database chiama, e tu non devi d per scrivere scegliere ..

E se volete chiamare il nome utente come parte del modello di posta unica u hanno avuto modo di dichiararlo come una proprietà in modello, quindi specificare alias nel scegliere ..

$criteria = new CDbCriteria; 
$criteria->with='author'; 
$criteria->select='author.username as auther_username'; 
$dataProvider=new CActiveDataProvider('Post', array(
    'criteria' => $criteria, 
)); 
var_dump($dataProvider->getData()); 

and in your Post model declare..

public $auther_username; 

Ora non getterà l'errore, ed è possibile accedere il nome utente da entrambi i modi .. $post->auther_username, e $post->auther->username

+0

non sto accusando, ma se hai downvoted, per favore spiega perché? perché non vedo nulla di sbagliato nel mio metodo, (né nel tuo). –

+0

quindi, sembra questo è ciò che op stava cercando, +1 –

+0

Funziona. Grazie mille . –

1

Prova questo:

$criteria = new CDbCriteria; 
$criteria->with=array('author'=>array('select'=>'username')); 

// you can still select Post table columns here 
$criteria->select='post_content'; 

$dataProvider=new CActiveDataProvider('Post', array(
    'criteria' => $criteria, 
)); 
var_dump($dataProvider->getData()); 
+0

Nah dude..thats non gli way..Its lo stesso .. – user1135655

+0

uguale a? i criteri sta funzionando di sicuro. fammi sapere quale riga di codice ti sta dando lo stesso risultato. –

+0

qualcuno upvoted alcuni giorni indietro! poi qualcuno ha downvoted alcune ore indietro! quindi downvoter, se leggi questo, per favore spiega la tua ragione, perché non c'è nulla di sbagliato nel mio codice e nel mio metodo. forse posso migliorare la risposta, se necessario. le critiche costruttive sono sempre benvenute –

1

Prova questo:

$criteria = new CDbCriteria; 
$criteria->with=array('author'=>array('select'=>'username')); 
$dataProvider=new CActiveDataProvider('Post', array(
    'criteria' => $criteria, 
)); 
var_dump($dataProvider->getData()); 

Fonte: CActiveRecord.with

In order to customize the options on the fly, we should pass an array parameter to the with() method. The array keys are relation names, and the array values are the corresponding query options.

Problemi correlati