【发布时间】:2015-01-26 09:22:53
【问题描述】:
我有 Post 模型和两个相关模型,User 和 Comments。
与Post 模型中定义的User 和Comment 模型的关系:
public function getUser()
{
return $this->hasOne(User::className(), ['id' => 'user_id']);
}
public function getUserName()
{
return $this->user->name;
}
public function getComments(){
return $this->hasMany(Comment::className(), ['comment_id' => 'id']);;
}
public function countCommentPoints() {
return $this->hasMany(Comment::className(), ['comment_id' => 'id'])->sum('point');
}
我的PostSearch 模型如下所示。我省略了代码 andFilterWhere() 因为它超出了范围:
class PostSearch extends Post {
public $userName;
public function rules()
{
return ['userName', 'safe'];
}
public function search($params) {
$query = Post::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$dataProvider->setSort([
'attributes' => [
'userName' => [
'asc' => ['user.name' => SORT_ASC],
'desc' => ['user.name' => SORT_DESC],
],
],
]);
if (!($this->load($params) && $this->validate())) {
$query->joinWith(['user']);
return $dataProvider;
}
}
return $dataProvider;
}
查看代码:
echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'id',
'title',
[
'attribute' => 'userName',
'value' => 'userName',
'label' => 'User Name'
],
[
'attribute' => 'comment',
'value' => function($model){
return $model->countCommentPoints();
},
'label' => 'Points',
],
],
]);
使用上面的所有代码,我可以按id 和title 以及userName 对记录进行排序,userName 是相关User 模型的一个属性。但我无法按Points 列排序,因为它不是Comment 模型的属性,而是getLeadEarningPerWebmaster() 方法返回的总和值。我曾尝试在http://www.yiiframework.com/doc-2.0/guide-output-data-widgets.html 阅读 Yii 2.0 文档,但 数据排序 部分仍在开发中。如何使GridView 按Points 列排序?
【问题讨论】:
-
排序适用于所有记录,而不仅仅是当前页面。也许你做错了什么(例如在搜索模型中应用额外的过滤器)。如果问题无法解决,请再次检查并添加更多信息或屏幕截图。
-
你是对的。排序适用于所有记录,但我不知道如何使其适用于连接模型。我已经编辑了我的问题和代码。如我上面的代码所示,它不按 user.name 排序。你知道怎么做吗?
-
我在您的查询中没有看到任何联接。
-
对不起,我没有添加具有这种关系方法的 Post 模型源代码: public function getUser(){ return $this->hasOne(User::className(), ['id' = > 'user_id']); }
-
我认为您不能仅靠关系来做到这一点。您可能需要手动加入表格。