php - transaction - transacciones laravel
¿Cómo vincular parámetros a una consulta de DB sin procesar en Laravel que se usa en un modelo? (6)
¿Por qué no?
$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();
Re,
Tengo la siguiente consulta:
$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();
No funciona: Invalid parameter number: mixed named and positional parameters
: Invalid parameter number: mixed named and positional parameters
.
¿Alguien sabe un truco o una solución (obviamente, puedo escribir la consulta completa, pero prefiero usar un generador fluido).
Me encontré con el mismo problema recientemente y la respuesta está en ese mensaje de error con mixed named and positional parameters
. En su caso, los parámetros :lat
y :lng
son nombrados mientras tiene $radius
como posicional. Entonces, una posible solución a su problema es usar havingRaw()
y aplicar los parámetros nombrados.
--havingRaw(''distance < :radius'', [''radius'' => $radius])
OK, después de experimentar, esta es la solución que se me ocurrió:
$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();
Básicamente, setBindings
tiene que ser llamado en la consulta. ¡Ojalá esto estuviera documentado!
Pregunta anterior, pero si tenemos que repetir una variable, tenemos que cambiar su valor de clave en la matriz de enlaces.
$property = Property::select(
DB::raw("title, lat, lng, ( 3959 * acos( cos( radians(:lat) ) *
cos( radians( lat ) ) * cos( radians( lng ) - radians(:lng) ) +
sin(radians(:lat_i) ) * sin( radians( lat ) ) ) ) AS distance"),
["lat" => $lat, "lng" => $lng, "lat_i" => $lat]);
Eso es suficiente.
Transmití la búsqueda cercana de Doctrine v1 a Laravel, compruébalo aquí.
Simplemente agregue el rasgo Geographical
al modelo y luego puede hacer:
$model->newDistanceQuery($request->query(''lat''), $request->query(''lon''))->orderBy(''miles'', ''asc'')->get();
Funciona mediante el uso de selectRaw con enlaces como este:
$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]);
}
$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();