CakePHP3:生成DB-Query

时间:2016-06-25 12:10:02

标签: php cakephp cakephp-3.2

我是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']);

1 个答案:

答案 0 :(得分:1)

  

如果$ params ['bounds']为真,我怎么才能添加两个andWhere语句?

查询方法旨在使用fluent interface来使用(如问题所示);这意味着每个方法都返回$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,必须使用the use language construct。与某些语言(最明显的是javascript)函数不同,不会自动访问父作用域中的变量。