2011-03-07 15 views
5

tengo algunas formas en Yii utilizando la siguiente para obtener una lista de los datos de las tablas relacionadas en la forma de un menú desplegable:Pedido dropDownList utilizando relaciones?

dropDownList(CHtml::listData(Company::model()->findAll(array('order' => 'company ASC')))); 

Esto funciona, pero eso significa que por cada lista desplegable (que theres un montón de) Estoy poniendo este array('order' => 'company ASC' en cada uno.

¿Es esta la mejor manera de hacerlo? ¿No hay una forma de obtener estos datos usando las relaciones modelo() y especificando el orden dentro de la relación?

Respuesta

5

Creo que la forma correcta de hacerlo es usando scopes.

Se puede definir cualquier número de ámbitos que ordenan el conjunto de resultados y utilizarlos de esta manera:

Company::model()->scopeName()->findAll(); 

Si su aplicación siempre exige a las empresas que se fue a buscar en una forma ordenada, incluso se puede definir una defecto Ambito de la clase del modelo:

public function defaultScope() { 
    return array('order' => 'company ASC'); 
} 

Esto resultará en cada llamada a Company::model()->findAll(); generando resultados ordenados.

+0

ah eso es justo lo que estoy buscando. ¡Gracias! – djt

+0

Pero lo que desea enviar a la base de datos es probablemente la identificación de la empresa, no el nombre de la compañía (que es lo que aparecerá en la lista desplegable). ¿Cómo maneja eso? –

1

Yo suelo añadir un opts() métodos para cada modelo que podría ser utilizado como fuente para una lista desplegable:

class Company extends CActiveRecord 
{ 
    // ... 

    public static opts() 
    { 
     $opts = array(); 
     foreach(self::model()->findAll(array('order'=>'name ASC')) as $model) 
      $opts[$model->id] = $model->name; 
     return $opts; 
    } 

Se utiliza como esto

echo $form->dropDownList($user, 'company_id', Company::opts()); 

Si necesita las mismas opciones varias veces en una página, incluso podría "almacenar en caché" el resultado en una variable de clase estática privada o usar DAO para obtener los datos de la lista de una manera más eficiente.