0

我是 CakePHP 的新手,我想根据 Google Maps Lat & Lng 查询我的数据库中的位置。如果是真的,我怎样才能andWhere只添加这两个语句$params['bounds']

$params = [
    'bounds' => 1,
    'swLat' => ...,
    'swLng' => ...,
    'neLat' => ...,
    'neLng' => ...
];

$locations = $this->Locations
    ->find()
    ->select(['id', 'name', 'lat', 'lng'])
    ->where(['live' => 1])
    ->andWhere(function ($exp, $q) {
          return $exp->between('lat', $params['swLat'], $params['neLat']);
    })
    ->andWhere(function ($exp, $q) {
          return $exp->between('lng', $params['swLng'], $params['neLng']);
    })
    ->order(['name' => 'ASC']);
4

1 回答 1

1

如果 $params['bounds'] 为真,如何仅添加两个 andWhere 语句?

查询方法旨在使用流畅的界面(如问题所示)使用;这意味着每个方法都返回$this对象。

所以要添加条件逻辑,首先进行无条件调用:

$locations = $this->Locations->find()
    ->select(['id', 'name', 'lat', 'lng'])
    ->where(['live' => 1])
    ->order(['name' => 'ASC']);

然后应用您希望的任何其他调用:

if (!empty($params['bounds'])) {
    $locations
        ->andWhere(function ($exp, $q) use ($params) {
          return $exp
              ->between('lat', $params['swLat'], $params['neLat']);
              ->between('lng', $params['swLng'], $params['neLng']);
        })
}

请注意,要$params在传递给的闭包内访问andWhere- 必须使用use 语言构造。与某些语言(尤其是 javascript)不同,函数不会自动访问父作用域中的变量。

于 2016-06-26T09:17:09.957 回答