yii2使用自定义列查询:未知列'列名'在'有条款'

时间:2014-12-03 03:16:22

标签: php mysql yii yii2

我陷入了这种情况

我在这里有一个小的自定义搜索模型代码

    $query = Ad::find();

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    if($subcategorymodel){
        $query->andFilterWhere([
            'sub_category_id' => $subcategorymodel->id,
        ]);
    }
    if($adcategorymodel){
        $query->andFilterWhere([
            'ad_category_id' => $adcategorymodel->id,
        ]);
    }
    if($nearmodel){
        $lat = $nearmodel->latitude;
        $long = $nearmodel->longitude;
        $query->select('*, (
        (
        ACOS( SIN( '.$lat.' * PI( ) /180 ) * SIN( latitude * PI( ) /180 ) + COS( '.$lat.' * PI( ) /180 ) * COS( latitude * PI( ) /180 ) * COS( ( '.$long.' - `longitude` ) * PI( ) /180 ) ) *180 / PI( )
        ) *60 * 1.1515 * 1.609344
        ) AS distance');

        $query->having('distance <=100'); //condition for my custom column
    }

    $query->andFilterWhere([
        'status' => 1,
    ]);

    return $dataProvider;

使用$ query-&gt;('distance&lt; = 100')运行正常;条款,但我得到这个错误

   SQLSTATE[42S22]: Column not found: 1054 Unknown column 'distance' in 'having clause'
   The SQL being executed was: SELECT COUNT(*) FROM `tbl_ad` WHERE ((`sub_category_id`=1) AND    (`ad_category_id`=1)) AND (`status`=1) HAVING distance <=100
   Error Info: Array
   (
     [0] => 42S22
     [1] => 1054
     [2] => Unknown column 'distance' in 'having clause'

在视图中我拥有的是

<?php 
    echo ListView::widget([
     'dataProvider' => $dataProvider,
     'itemOptions' => ['class' => 'item'],
     'itemView' => '_item_view',
     'pager' => ['class' => \kop\y2sp\ScrollPager::className()]
]);
?>

并且在检查错误堆栈时,在代码的某处,yii2在这里调用此函数(我想要使用分页数据)

public function count($q = '*', $db = null)
{
    return $this->queryScalar("COUNT($q)", $db);
}

那么,有解决方案/解决方法吗?

1 个答案:

答案 0 :(得分:1)

这是一个难以运行的查询吗?你有很多记录,因为最愚蠢的解决方案是宣布

$query->having('(
        (
        ACOS( SIN( '.$lat.' * PI( ) /180 ) * SIN( latitude * PI( ) /180 ) + COS( '.$lat.' * PI( ) /180 ) * COS( latitude * PI( ) /180 ) * COS( ( '.$long.' - `longitude` ) * PI( ) /180 ) ) *180 / PI( )
        ) *60 * 1.1515 * 1.609344
        ) <=100');

另一个解决方案是创建自己的Query类,并使用您自己的版本覆盖计数,并将其考虑在内。