Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将参数绑定到模型上使用的Laravel中的原始DB查询?_Php_Mysql_Pdo_Laravel_Laravel 4 - Fatal编程技术网

Php 如何将参数绑定到模型上使用的Laravel中的原始DB查询?

Php 如何将参数绑定到模型上使用的Laravel中的原始DB查询?,php,mysql,pdo,laravel,laravel-4,Php,Mysql,Pdo,Laravel,Laravel 4,关于, 我有以下疑问: $property = Property::select( DB::raw("title, lat, lng, ( 3959 * acos( cos( radians(:lat) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(:lng) ) +

关于,

我有以下疑问:

$property = 
    Property::select(
        DB::raw("title, lat, lng, ( 
            3959 * acos( 
                cos( radians(:lat) ) * 
                cos( radians( lat ) ) * 
                cos( radians( lng ) - radians(:lng) ) + 
                sin( radians(:lat) ) * 
                sin( radians( lat ) ) 
            ) 
        ) AS distance", ["lat" => $lat, "lng" => $lng, "lat" => $lat])
    )
    ->having("distance", "<", $radius)
    ->orderBy("distance")
    ->take(20)
    ->get();
无效:参数编号无效:混合命名参数和位置参数


有谁知道一个技巧或解决方法吗?我显然可以编写完整的查询,但更喜欢使用fluent builder。

好的,经过一些实验,我想出了一个解决方案:

$property = 
    Property::select(
        DB::raw("title, lat, lng, ( 
            3959 * acos( 
                cos( radians(  ?  ) ) *
                cos( radians( lat ) ) * 
                cos( radians( lng ) - radians(?) ) + 
                sin( radians(  ?  ) ) *
                sin( radians( lat ) ) 
            )
       ) AS distance")
    )
    ->having("distance", "<", "?")
    ->orderBy("distance")
    ->take(20)
    ->setBindings([$lat, $lng, $lat,  $radius])
    ->get();

基本上,必须对查询调用setBindings。但愿这是有案可查的

老问题,但是如果我们必须重复一个变量,我们必须在绑定数组中更改它的键值

$property=属性::选择 DB::rawtitle,纬度,液化天然气,3959*acos弧度:纬度* cos弧度横向*cos弧度lng-弧度:lng+ sinradians:lat_i*sin radians lat作为距离, [lat=>$lat,lng=>$lng,lat_i=>$lat]; 够了。为什么不呢

$select = <<<SQL
    title,
    lat,
    lng,
    (3959*acos(cos(radians( ? ))*cos(radians(lat))*cos(radians(lng)-radians( ? ))+sin(radians( ? ))*sin(radians(lat)))) AS distance
SQL;

$property = Property::selectRaw($select, [$lat, $lng, $lat])
    ->having('distance', '<', $radius)
    ->orderBy('distance')
    ->take(20)->get();
    $latitude = $request->input('latitude', '44.4562319000');
    $longitude = $request->input('longitude', '26.1003480000');
    $radius = 1000000;

    $locations = Locations::selectRaw("id, name, address, latitude, longitude, image_path, rating, city_id, created_at, active,
                         ( 6371 * acos( cos( radians(?) ) *
                           cos( radians( latitude ) )
                           * cos( radians( longitude ) - radians(?)
                           ) + sin( radians(?) ) *
                           sin( radians( latitude ) ) )
                         ) AS distance", [$latitude, $longitude, $latitude])
        ->where('active', '1')
        ->having("distance", "<", $radius)
        ->orderBy("distance")
        ->get();

我最近也遇到了同样的问题,答案是错误消息混合了命名参数和位置参数。在本例中,:lat和:lng是命名参数,而$radius是位置参数。因此,解决问题的一个可能方法是使用havingRaw并应用命名参数

-havingRaw'distance<:radius',['radius'=>$radius]
我把附近的搜索从Doctrine v1转移到了Laravel

只需将地理特征添加到模型中,即可执行以下操作:

$model->newDistanceQuery($request->query('lat'), $request->query('lon'))->orderBy('miles', 'asc')->get();
它通过使用selectRaw和如下绑定来工作:

$sql = "((ACOS(SIN(? * PI() / 180) * SIN(" . $latName . " * PI() / 180) + COS(? * PI() / 180) * COS(" . $latName . " * PI() / 180) * COS((? - " . $lonName . ") * PI() / 180)) * 180 / PI()) * 60 * ?) as " . $unit;
if($kilometers){
    $query->selectRaw($sql, [$lat, $lat, $lon, 1.1515 * 1.609344]);
}
else{
    // miles
    $query->selectRaw($sql, [$lat, $lat, $lon, 1.1515]);
}

愚蠢的问题-但文档在其任何示例中都没有使用。您尝试过单打吗?@JamesBinford是的,尝试过所有可能的组合,包括%s您在查询中有2:lat,但只有绑定1@davidstrachan似乎没有任何区别。+1正在寻找这个确切的答案…包括地图半径查询。谢谢setBindings似乎不支持PDO的命名参数:/例如,如果您正在处理关系,则应使用addBinding而不是setBindings来避免覆盖关系绑定。这是setBindingsarray$bindings的签名,$type='where'。如果WHERE子句中有一个绑定,那么这些绑定就会被覆盖。您应该指定绑定用于查询的SELECT部分。->setBindings[$lat,$lng,$lat,$radius],'select'对我来说也很有用,尽管它不能很好地使用->where,所以我不得不绑定这个工具名。谢谢,先生。在哪个版本中可以将绑定作为DB::raw的第二个参数?我在Laravel 4.2中使用了它。在4.2中,您可以将绑定作为WHERRAW中的第二个参数,但在DB::raw中不可以。在上面的例子中,绑定被传递给select,而不是DB::raw。我得到一个错误,strtolower希望参数1是字符串,数组给定这是一个2年的问题。selectRaw在当时不可用。selectRaw接受绑定