【问题标题】:Binding vars to raw queries将变量绑定到原始查询
【发布时间】:2015-08-15 01:49:30
【问题描述】:

我正在尝试将变量绑定到我的原始查询:

$data = $myModel->select( DB::raw('(3959 * acos(cos(radians(:lat)) * cos(radians(lat)) * cos(radians(lng) - radians(:lng)) + sin(radians(:lat)) * sin(radians(lat)))) as distance'), array(
        'lat' => $lat, 'lng' => $lng,
    ))->orderBy('distance', 'ASC')->having('distance', '<', $radius)
    ->get();

我查看了导致这篇博文的各种 SO 帖子:

http://fideloper.com/laravel-raw-queries

我仍然收到错误:

strtolower() expects parameter 1 to be string, array given

我哪里错了?

【问题讨论】:

  • 不幸的是,我需要一个实例 - 稍后我有一些 if 语句来确定一些 where 子句。

标签: laravel laravel-4 eloquent laravel-5


【解决方案1】:

您必须将变量绑定到raw 方法而不是select

$select = "(3959 * acos(cos(radians(:lat)) * cos(radians(lat)) * cos(radians(lng) - radians(:lng)) + sin(radians(:lat)) * sin(radians(lat)))) as distance";
$data = $myModel->select( DB::raw($select,array(
    'lat' => $lat, 'lng' => $lng,
)))->orderBy('distance', 'ASC')->having('distance', '<', $radius)
->get();

或者直接使用selectRaw方法:

$data = $myModel->selectRaw($select,array(
    'lat' => $lat, 'lng' => $lng,
))->orderBy('distance', 'ASC')->having('distance', '<', $radius)
->get();

【讨论】:

  • 谢谢,我现在收到此错误:无效参数编号:混合命名参数和位置参数(SQL:select (3959 * acos(cos(radians(:lat)) * cos(radians(lat)) * cos(radians(lng) - radians(:lng)) + sin(radians(:lat)) * sin(radians(lat)))) 与 users 的距离 distance distance升序)
  • @panthro 用问号 (?) 替换您的命名绑定:$data = $myModel-&gt;selectRaw("(3959 * acos(cos(radians(?)) * cos(radians(lat)) * cos(radians(lng) - radians(?)) + sin(radians(?)) * sin(radians(lat)))) as distance",array($lat, $lng, $lat))-&gt;orderBy('distance', 'ASC')-&gt;having('distance', '&lt;', $radius) -&gt;get();(也请注意更新的绑定数组)。
猜你喜欢
  • 1970-01-01
  • 2019-01-18
  • 2021-08-02
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 2018-03-17
相关资源
最近更新 更多