【问题标题】:Laravel database query distance between two coordinatesLaravel 数据库查询两个坐标之间的距离
【发布时间】:2015-02-04 04:49:15
【问题描述】:

所以我对我的 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 时,我想重写这个查询。

所以我要查询的是土壤样本的 X 坐标和 Y 坐标。 (在瑞典,我们有一个名为 RT90 的坐标系,它使用 X 和 Y 而不是纬度/经度)。我还输入了搜索半径。 我想找到具有该半径的圆内的每个样本。

在过去的一个小时里,我一直在尝试将我之前的查询翻译成在 Laravel 中有用的东西。但我遇到了一些麻烦。

有没有人对使用 Eloquent 或 DB::raw 的好查询提出建议? 完成该查询后,结果将被传递给 json_encode。用于在 JavaScript 中进一步处理。 这对我之前的查询很有效,如果你们也能想到这一点,那就太好了。

我的 Laravel 模型是 Sample 和 Costumer。

谢谢,西蒙

【问题讨论】:

    标签: mysql laravel eloquent


    【解决方案1】:

    最快的解决方案是直接运行查询:

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

    在此之后,$results 将是具有您选择的属性的 stdClass 对象数组。

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

    $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 对象的 Collection,并且每个 Sample 对象都会有其相关的 Costumers 急切加载到它上面。从这里开始,您需要使用您的对象来构建最终结果集,并且有很多方法可以做到这一点。

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

    【讨论】:

    • 我使用以下代码得到了这个查询:DB::table('samples')-&gt;selectRaw('samples.*, samples.costumer_id as id, concat(costumers.name, " ", costumers.lastName) as name, costumers.telefon as telefon')-&gt;leftJoin('costumers', 'samples.costumer_id', '=', 'costumers.id')-&gt;whereRaw('(sqrt(pow( ? - Y, 2) + pow( ? - X, 2))) &lt; ?', [$x, $y, $radie])-&gt;get();我全神贯注寻求更好的建议!
    猜你喜欢
    • 1970-01-01
    • 2017-08-06
    • 2010-11-23
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 2018-06-12
    相关资源
    最近更新 更多