2014-12-03 126 views
0

,我被捉住了在这里的情况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; 

它运行“having子句”中罚款与$查询 - >有('距离< = 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

这是一个硬查询运行?你有很多的记录作为最笨的办法是宣布

$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'); 

另一个解决方案是创建自己的查询类并覆盖你自己的版本,是以有考虑计数。