5

I have some forms in Yii using the following to get lists of data from related tables in the form of a drop down:

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

This works, but that means for every drop down list (which theres a lot of) I'm putting this array('order' => 'company ASC' in every one.

Is this the best way to do it? Is there not a way to get this data using the model relations(), and specifying the order within the relation?

tshepang
  • 12,111
  • 21
  • 91
  • 136
djt
  • 7,297
  • 11
  • 55
  • 102

2 Answers2

5

I believe that the correct way to do this is by using scopes.

You can define any number of scopes that order the result set and use them like so:

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

If your application always requires companies to be fetched in a sorted order, you can even define a default scope in your model class:

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

This will result in every call to Company::model()->findAll(); returning sorted results.

Jon
  • 428,835
  • 81
  • 738
  • 806
  • But what you want to send to the database is probably the Company ID, not the company name (which is what'll appear in the dropdownlist).. How do you handle that? – Felipe Jan 31 '12 at 11:19
1

I usually add an opts() methods to each model that could be used as source for a dropdown:

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

It's used like this

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

If you need the same options several times on a page, you could even "cache" the result in a private static class variable or use DAO to fetch the list data in a more efficient way.

Michael Härtl
  • 8,428
  • 5
  • 35
  • 62