スポンサーリンク

Laravelでgeometory型を使うときはEloquentじゃなくて生のSQL・・・?

プログラミング
スポンサーリンク

はじめに

LAMP環境でLaravelを使っていて、地図情報の緯度経度を保存する機会がありました。
Eloquentでエラーになり、緯度経度の値をgeometory型に保存できなくて苦戦した話です。

結論

加工したデータを、(渋々)生のSQLに渡して解決

詳細

イメージを伝える為に、それっぽいコードを書きます

下記のlocationカラムに、緯度と経度を保存したい

class StationsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('stations', function (Blueprint $table) {
            $table->increments('id')->comment('駅id')->unsigned();
            $table->geometry('location')->comment('緯度経度');
            $table->timestamps();
        });
    }

フォームから取得した緯度と経度を加工して、locationに保存。
POINT(139.7454299032688 35.65858405958573) みたいな値が保存される。

        //緯度経度加工
        if (!empty($form['coordinate'])) {
            //経度
            $lon = $form['coordinate']['lon'];
            //緯度
            $lat = $form['coordinate']['lat'];

            $coordinate = "GeomFromText('POINT(" . $lon . " " . $lat . ")')";
        } else {
            $coordinate = '';
        }

        if (empty($station)) {
            DB::insert("
                    INSERT INTO station
                        (location)
                    VALUES($coordinate)
                ");

下記がEloquentで上手く処理できなくて、(確か)エラーになってました
関数の中の関数が、エスケープされてる風でした

$coordinate = "GeomFromText('POINT(" . $lon . " " . $lat . ")')";

調べ返してもちゃんと理解するのに時間かかりそうだったので、下記のざっくり理解でとどめておきました

  • 緯度経度を管理するのにgeometoryクラス(型)にする必要がある
  • geometory型に保存するには、GeomFromText関数を使用する必要がある
  • 緯度経度のひとまとめの値として認識させるのに、POINT関数を使う必要がある

参考:https://kengotakimoto.com/post-2850/

おわりに

Mysqlについてある程度わかったつもりでいましたが、奥が深いですね

補足

「Eloquintで使えるソース公開してるよ」というコメント頂いたので、リンク貼ります
https://qiita.com/nunulk/items/bf4e2b005d4cd33d2f9b

コメント