Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Yii2排序不属于gridview模型的间接相关列_Gridview_Yii - Fatal编程技术网

Yii2排序不属于gridview模型的间接相关列

Yii2排序不属于gridview模型的间接相关列,gridview,yii,Gridview,Yii,我有一个显示公司数据的gridview。每个公司都有一个tehsil_id作为外键。以下是从父级到子级的表结构: Country->province->city->district->tehsil 每家公司都位于一个特定的地区。一个地区、城市或省可以使用乡ID向后追踪 我面临的问题是,我想列出的公司不仅可以按Tehsil ID(公司表中的一列)排序,还可以按城市ID/省ID/国家ID(这些ID都不是公司表的一部分)排序 我可以在gridview中列出这些相关的地区/城市

我有一个显示公司数据的gridview。每个公司都有一个tehsil_id作为外键。以下是从父级到子级的表结构:

Country->province->city->district->tehsil
每家公司都位于一个特定的地区。一个地区、城市或省可以使用乡ID向后追踪

我面临的问题是,我想列出的公司不仅可以按Tehsil ID(公司表中的一列)排序,还可以按城市ID/省ID/国家ID(这些ID都不是公司表的一部分)排序

我可以在gridview中列出这些相关的地区/城市/省份,但无法使用这些值进行排序。谢谢你的帮助

<?php
echo GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [

        'id',
        'name',
        // generated by schmunk42\giiant\crud\providers\RelationProvider::columnFormat
        [
            "class" => yii\grid\DataColumn::className(),
            "attribute" => "tehsil_id",
            'filter' => ArrayHelper::map(Tehsil::find()->orderBy('name')->asArray()->all(), 'id', 'name'),
            "value" => function ($model) {
                if ($rel = $model->getTehsil()->one()) {
                    return yii\helpers\Html::a($rel->name, ["crud/tehsil/view", 'id' => $rel->id,], ["data-pjax" => 0]);
                } else {
                    return '';
                }
            },
            "format" => "raw",
        ],

        [
            "class" => yii\grid\DataColumn::className(),
            "attribute" => "district_id",
            'filter' => ArrayHelper::map(District::find()->orderBy('name')->asArray()->all(), 'id', 'name'),
            "value" => function ($model) {
                if ($rel = $model->getTehsil()->one()->getDistrict()->one()) {
                    return yii\helpers\Html::a($rel->name, ["crud/district/view", 'id' => $rel->id,], ["data-pjax" => 0]);
                } else {
                    return '';
                }
            },
            "format" => "raw",
        ],


        [
            "class" => yii\grid\DataColumn::className(),
            "attribute" => "city_id",
            'filter' => ArrayHelper::map(City::find()->orderBy('name')->asArray()->all(), 'id', 'name'),
            "value" => function ($model) {
                if ($rel = $model->getTehsil()->one()->getDistrict()->one()->getCity()->one()) {
                    return yii\helpers\Html::a($rel->name, ["crud/city/view", 'id' => $rel->id,], ["data-pjax" => 0]);
                } else {
                    return '';
                }
            },
            "format" => "raw",
        ],
        // generated by schmunk42\giiant\crud\providers\RelationProvider::columnFormat
        [
            "class" => yii\grid\DataColumn::className(),
            "attribute" => "company_id",
            "value" => function ($model) {
                if ($rel = $model->getCompany()->one()) {
                    return yii\helpers\Html::a($rel->name, ["crud/company/view", 'id' => $rel->id,], ["data-pjax" => 0]);
                } else {
                    return '';
                }
            },
            "format" => "raw",
        ],
        'phone',
        'fax',
        'mobile',
        'email:email',
        /*
        'created_on',
        'updated_on',
        'created_by',
        'updated_by',
        */
        [
            'class' => 'yii\grid\ActionColumn',
            'urlCreator' => function ($action, $model, $key, $index) {
                // using the column name as key, not mapping to 'id' like the standard generator
                $params = is_array($key) ? $key : [$model->primaryKey()[0] => (string)$key];
                $params[0] = \Yii::$app->controller->id ? \Yii::$app->controller->id . '/' . $action : $action;
                return \yii\helpers\Url::toRoute($params);
            },
            'contentOptions' => ['nowrap' => 'nowrap']
        ],
    ],
]);

只能对原始查询中存在的列进行排序。很可能您有一个
CompanySearch
类,该类具有
search()
方法。在其中,将更多表连接到原始查询:

$query = Company::find()->joinWith([
    'tehsil',
    'tehsil.district',
    'tehsil.district.city',
    'tehsil.district.city.province',
    'tehsil.district.city.province.country'
]);
然后将新列添加到网格:

echo GridView::widget([
    ...
    'columns' => [
        'id',
        'name',
        'tehsil',
        'tehsil.district',
        'tehsil.district.city',
        'tehsil.district.city.province',
        'tehsil.district.city.province.country',
        ...
它们应该是可排序的

此外,请查看本教程: