2012-02-19 27 views
6

estoy teniendo mucha dificultad para seleccionar los nombres de usuario de todos los mensajes en el blog de demostración dada en Yii ..Yii CDbCriteria seleccionar columnas de una relación

autor es la relación de la clase post con el usuario ...

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

error:

registro activo "post" está tratando de seleccionar una columna no válido "author.username". Tenga en cuenta que la columna debe existir en la tabla o ser una expresión con alias.

Respuesta

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..

En su caso lo que está sucediendo es que estamos tratando de escribir la columna de alguna relación en la selección, que estará allí en selecto incluso sin escribirlo, pero como no hay una variable correspondiente para mapear este valor, yii está arrojando un error.

Primero, si necesita el nombre de usuario de auther en respuesta, puede obtenerlo por llamada de relación, que no será una base de datos llama, y ​​no necesitas d para escribir elegir ..

Y si quieres llamar el nombre de usuario como parte del modelo de puestos de trabajo sólo u han llegado a declarar como una propiedad en el modelo, y luego especificar alias en elegir ..

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

Ahora bien, no va a tirar de error, y se puede acceder mediante el nombre de usuario en ambos sentidos .. $post->auther_username y $post->auther->username

+0

, no lo acuso, pero si votó negativamente, explique por qué? porque no veo nada malo en mi método (ni en el tuyo). –

+0

entonces, parece que esto es lo que estaba buscando, +1 –

+0

Funciona. Muchas gracias . –

1

Prueba esto:

$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 no los way..Its lo mismo .. – user1135655

+0

mismo que en? el criterio está funcionando con seguridad. déjame saber qué línea de código te está dando el mismo resultado. –

+0

¡alguien votó hace unos días! ¡entonces alguien votó hace unas horas! Así que, si leen esto, por favor, expliquen su razón, porque no hay nada malo en mi código y en mi método. tal vez pueda mejorar la respuesta, si es necesario. la crítica constructiva siempre es bienvenida –

1

Prueba esto:

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

Fuente: 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.

Cuestiones relacionadas