Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.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
Php Yii2 gridview筛选数据库中不存在的计算列_Php_Yii2 - Fatal编程技术网

Php Yii2 gridview筛选数据库中不存在的计算列

Php Yii2 gridview筛选数据库中不存在的计算列,php,yii2,Php,Yii2,例如,我添加了一个列距离,其中属性作为距离。 不同行的结果可能在5到20英里之间变化。该查询类似于如果结果小于5英里,则显示null 现在我想对记录进行预过滤,只显示距离小于5公里的记录,或者说结果为空 我怎样才能做到 属性代码如下所示: [ 'attribute'=>'distance', 'value'=>function($data){ $volunteer = UserP

例如,我添加了一个列距离,其中
属性
作为距离。 不同行的结果可能在5到20英里之间变化。该查询类似于如果结果小于5英里,则显示null

现在我想对记录进行预过滤,只显示距离小于5公里的记录,或者说结果为空

我怎样才能做到

属性代码如下所示:

[
            'attribute'=>'distance',
            'value'=>function($data){              
               $volunteer = UserProfile::findOne(['user_id'=>Yii::$app->user->identity->id]);

                $lat_add = $volunteer->lat_add;
                $long_add = $volunteer->long_add;
                $db = Yii::$app->db;
                $query = "SELECT id,(
                3959 * acos 
                (cos ( radians($lat_add))
                * cos( radians( lat_add )) 
                * cos( radians( long_add) - radians($long_add))
                 + sin ( radians($lat_add) ) 
                * sin( radians( lat_add)))) 
                AS distance FROM user_profile where `user_id` = $data->posted_by 
                HAVING distance < 8.04672 ORDER BY distance LIMIT 0 , 20";
                $result = $db->createCommand($query)->queryOne();                
                return $result['distance'];
            }
        ],
[
'属性'=>'距离',
'value'=>函数($data){
$志愿者=UserProfile::findOne(['user_id'=>Yii::$app->user->identity->id]);
$lat_add=$志愿者->lat_add;
$long\u add=$志愿者->long\u add;
$db=Yii::$app->db;
$query=“选择id(
3959*acos
(cos(弧度($lat_add))
*cos(弧度(纬度加)
*cos(弧度(长加)-弧度($长加))
+sin(弧度($lat_add))
*sin(弧度(lat_add)))
与用户配置文件的距离,其中“用户id”=$data->posted\U by
距离小于8.04672,距离限值为0,20”;
$result=$db->createCommand($query)->queryOne();
返回$result['distance'];
}
],

如果不需要显示空距离的行
而不是在gridView中对每行结果值重复查询 在操作中,应仅选择具有此功能的行,例如:

使用适当的sqlDatProvider

   "SELECT col1
            , col2
            , col3 
            , id
            , ( 3959 * acos 
                (cos ( radians($lat_add))
                * cos( radians( lat_add )) 
                * cos( radians( long_add) - radians($long_add))
                 + sin ( radians($lat_add) ) 
                * sin( radians( lat_add)))) 
                AS distance
     FROM user_profile where `user_id` = $data->posted_by 
     HAVING distance < 8.04672 7
     ORDER BY distance LIMIT 0 , 20"; 
“选择col1
,col2
,col3
身份证件
,(3959*acos
(cos(弧度($lat_add))
*cos(弧度(纬度加)
*cos(弧度(长加)-弧度($长加))
+sin(弧度($lat_add))
*sin(弧度(lat_add)))
作为距离
从用户配置文件,其中“用户id”=$data->posted\u by
距离小于8.046727的
按距离限制0,20”排序;

这样,您的查询只返回您想要显示的行

请澄清您的问题,您的sql有问题吗?你们是不是想根据两个点的经纬度来计算距离?或者你得到了价值,但你不能把5公里的条件?不,没有sql的问题,它是完美的工作。正如我所说,我得到的结果范围超过5英里,即8.04672英里。因此,当结果为空时,我不想在gridview.gridview中显示该行/记录。gridview具有rowOptions,在该函数中可以执行此检查,如果距离为null,则将其隐藏,或者可以在$dataprovider中执行此操作,将此检查放在主查询中,我想隐藏整行。我尝试了dataProvider,但我发现没有这样的专栏。至于rowOption-不确定如何使用它隐藏行。请更新您的问题并添加相关操作,以便我们可以了解您如何准备数据提供程序。.谢谢@scaisEdge-我将尝试,以前未使用过sqlDataProvider。但我能以不同的方式解决同样的问题。例如,我在模型
getDistanceMiles
和包含该函数的闭包中的gridview以及控制器
$dataProvider->query->andWhere(“$Model->distanceMiles<8.04672”)中创建了一个函数@Joshi。。但是通过这种方式,您必须隐藏不需要的行。。根据我的建议,你没有要隐藏的行。。。。您只需要一个适当的sql查询,并在sqldataprovider中使用它。您可以在这里查看sqldataprovider吗?我在搜索时遇到错误-