Alec Smythe
Alec Smythe

Reputation: 810

Yii2 sort object defaultOrder

I have a table of policies that belong to chapters. When I view the policies in my grid view I want the default order be policy title within chapter title. I see how to set up sort attributes to enable this, but I can't figure out how to set the defaultOrder to be based on chapter title and then policy title. When ever I try to set policy.title as an attribute in the defaultOrder setting I get an error.

Upvotes: 1

Views: 692

Answers (2)

Alec Smythe
Alec Smythe

Reputation: 810

I could not get Fabrizio's answer to work, because my chapter table is policy_chapter, not just chapter and so is not the same as the relation name. When I tried to use the relation name, I got errors. I finally figured out in the sort, you have to use the names of the related tables, not the relations, and add them as attributes. e.g.:

$dataProvider = new ActiveDataProvider([
    'query' => $query,
    'pagination' => ['pageSize' => 50],
    'sort' => [
        'defaultOrder' => ['policy_chapter.sort' => SORT_ASC,'policy_chapter.title' => SORT_ASC],
        'enableMultiSort' => true,
        'attributes' => [
            'id' => [
                'asc' => ['policy.id' => SORT_ASC],
                'desc' => ['policy.id' => SORT_DESC],
                'default' => SORT_ASC
            ],
            'chapter_id' => [
                'asc' => ['policy_chapter.sort' => SORT_ASC,'policy_chapter.title' => SORT_ASC],
                'desc' => ['policy_chapter.sort' => SORT_DESC,'policy_chapter.title' => SORT_DESC],
                'default' => SORT_ASC,
            ],
            'reference' => [
                'asc' => ['reference' => SORT_ASC],
                'desc' => ['reference' => SORT_DESC],
                'default' => SORT_ASC
            ],
            'title' => [
                'asc' => ['policy.title' => SORT_ASC],
                'desc' => ['policy.title' => SORT_DESC],
                'default' => SORT_ASC
            ],
            'policy_chapter.sort',
            'policy_chapter.title',
        ],
    ],
]);

Use the relation name or leave out the attributes and you get errors. Before I was writing

'defaultOrder' => ['policy_chapter.sort' => SORT_ASC,'policy_chapter.title' => SORT_ASC],

and Yii was not happy

Upvotes: 0

Fabrizio Caldarelli
Fabrizio Caldarelli

Reputation: 3008

If Policy is model class of policy table that has a relation with chapter table named 'chapter' and linked by chapter_id field, such as:

public function getChapter()
{
    return $this->hasOne(Chapter::className(), ['chapter_id' => 'chapter_id']);
}

Now you build query object with policy joined with chapter:

$query = Policy::find()
->joinWith(['chapter']);

 $dataProvider = new ActiveDataProvider([
     'query' => $query,
     'sort'=> ['defaultOrder' => ['chapter.title'=>SORT_ASC, 'policy.title' => SORT_ASC]]
 ]);

Upvotes: 1

Related Questions