はじめに
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
