1

在使用 CakePHP 2.2.4 中的半正弦公式计算距离时,我试图对结果列表进行分页,但在 having 子句中的计算字段周围出现错误。

我认真地花了数周时间试图弄清楚这一点,但我做不到。我已经阅读了几篇文章,有些说我需要覆盖计数方法,有些说尝试其他但与旧版本的 Cake 相关的东西。

有人可以告诉我我需要做什么才能让这个工作吗一定有数百人试图实现同样的目标并取得成功!

我正在使用的代码是:

'Business' => array(
        'conditions' => array(
            'Business.is_active' => 1
        ),
        'fields' => array(
            'Business.*',
            '( 6371 * acos( cos( radians(' . $location['Location']['latitude'] . ') ) * cos( radians( Business.latitude ) ) * cos( radians( Business.longitude ) - radians(' . $location['Location']['longitude']  . ') ) + sin( radians(' . $location['Location']['latitude']  . ') ) * sin( radians( Business.latitude ) ) ) ) AS distance'
        ),
        'group' => array(
            'Business.id HAVING distance <= 5',
        ),
        'contain' => array(
            'UserReview',
            'Certification',
            'Package' => array(
                'MassageType',
                'PackageVariation' => array(
                    'order' => array(
                        'cost_in_dollars' => 'ASC'
                    )
                )
            )
        ),
        'order' => array(
            'distance' => 'ASC',
            'Business.name' => 'ASC',
        )
    )

我不断收到的错误是:

错误:SQLSTATE [42S22]:未找到列:1054“有子句”中的未知列“距离”

请帮忙!

4

2 回答 2

0

在试图找到解决这个有子句问题的方法后,我也放弃了。似乎在 CakePHP V2 中是不可能的。最后我必须采用另一种方式:

    $expression = '( 3959 * acos( cos( radians(' . $session_lat . ') ) * cos( radians( User.lat ) ) * cos( radians( User.lng ) - radians(' . $session_lng . ') ) + sin( radians(' . $session_lat . ') ) * sin( radians( User.lat ) ) ) )';
$conditions[] = $expression . ' < 100';
$this->controller->Paginator->settings = array(
    'fields' => array('Item.*', $expression.' as distance'),
    'limit' => $limit,
    'order' => array('Item.id' => 'Desc'),
    'conditions' => $conditions,
    'joins' => $joins,
    'paramType' => 'querystring'
);

因此,正如您所看到的,我已将计算字段再次置于 where 条件下。我希望它会帮助某人。

于 2014-06-12T07:56:53.043 回答
0

这种情况的解决方案是使用虚拟字段:

$this->Business->virtualFields = array(
'distance' => '( 6371 * acos( cos( radians(' . $location['Location']['latitude'] . ') ) * cos( radians( Business.latitude ) ) * cos( radians( Business.longitude ) - radians(' . $location['Location']['longitude']  . ') ) + sin( radians(' . $location['Location']['latitude']  . ') ) * sin( radians( Business.latitude ) ) ) )'
);

之后,您可以使用“距离”作为字段:

$this->Paginator->settings = array(
  'limit' => 20,
  'order' => array('Business.distance' => 'ASC'),
  'conditions' => array('Business.distance <=' => 100)
);

$data = $this->Paginator->paginate('Business');

您可以在此处阅读有关 CakePHP 虚拟字段的更多信息:http: //book.cakephp.org/2.0/en/models/virtual-fields.html

于 2015-09-22T15:29:02.237 回答