Laravel数据库查询两个坐标之间的距离

时间:2015-02-03 19:35:13

标签: mysql laravel eloquent

所以我对我的MySQL数据库有这个查询,

$sql = "SELECT  samples.* ,
                CONCAT(costumers.name, ' ', costumers.lastName) AS name, costumers.telefon AS telefon
FROM samples
LEFT OUTER JOIN costumers
ON samples.id = costumers.costumer_id
WHERE (sqrt(pow( :x_center - `Y` , 2) + pow( :y_center - `X`, 2 ))) < :radius";

这样做真的很棒。但是当我转移到Laravel时,id喜欢重写这个查询。

所以我要查询的是我的X坐标和土壤样本的Y坐标。 (在瑞典,我们有一个名为RT90的坐标系,它使用X和Y代替Lat / Long)。我也输入了搜索半径。 我想找到那个半径范围内的每个样本。

我一直试图将我之前的查询翻译成最后一小时在Laravel中有用的东西。但我遇到了一些麻烦。

有没有人对使用Eloquent或DB :: raw的好查询提出建议? 完成该查询后,结果将传递给json_encode。用于在JavaScript中进一步处理。 这与我之前的查询工作正常,如果你们也考虑到这一点,那将会很好。

我的Laravel模型是Sample和Costumer。

谢谢,西蒙

1 个答案:

答案 0 :(得分:0)

最快的解决方案就是只需运行查询:

$results = DB::select($sql, array(
    'x_center' => 0,
    'y_center' => 0,
    'radius' => 0
);

在此之后,$results将是一个stdClass对象数组,其中包含您选择的属性。

如果您正在寻找更多Laravel-ish解决方案,您可以使用Eloquent模型构建一个可以提供类似结果的查询。假设您的Sample / Costumer关系设置正确,您可以这样做:

$results = Sample::with('costumers')
    ->whereRaw("(sqrt(pow( :x_center - `Y` , 2) + pow( :y_center - `X`, 2 ))) < :radius", array(
        'x_center' => 0,
        'y_center' => 0,
        'radius' => 0,
    ))
    ->get();

在这种情况下,$results将是Sample对象的集合,每个Sample对象都会将其相关的Costumers加载到其上。从这里开始,您需要使用您的对象来构建最终结果集,并且有很多可能性来实现。

有关将模型转换为array / json的一些信息是here,它遍历toArray()/ toJson()方法,并提及访问器和追加/可见/隐藏属性。例如,您可能需要考虑向Costumer模型添加full_name访问器(documenation here),然后将其添加到appends属性以确保它包含在array / json中。