はじめに
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
コメント