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吗?我在搜索时遇到错误-