Postgresを使ってLaravel + Model + JSONを使う
DBを利用したJSON操作を考察
Laravel開発でJSONデータを使おうと思い自分なりのやり方をまとめてみました。
環境
- 開発環境
- ローカルPC
- Mac Book pro (13-inch, 2018, Four Thunderbolt 3 Ports)
- Laravel 6.10
- Postgres 10.5
概要
DBのJSON操作を考えてサンプルとして記載、構造は2テーブルで考えてきます。 ECサイトをイメージして以下の2つのテーブルを準備、商品とそれに紐づくタグを作ります.
- products 商品情報を記載
- tags 商品のタグを記載 ※この方法が最善かどうかは各個人で判断してください。 ※Laravelの基本的な使い方に関しても記載致しません、Laravelのページなどを参考にしてください。
ソースコード
以下のリンクGithubを参照
スキーマ & データ
CREATE TABLE products (
product_id SERIAL,
name VARCHAR(256),
tags JSON,
PRIMARY KEY(product_id)
);
CREATE TABLE tags (
tag_id SERIAL,
name VARCHAR(256),
PRIMARY KEY(tag_id)
);
INSERT INTO products(name, tags) VALUES('product1', '["tag1"]');
INSERT INTO tags(name) VALUES('tag1');
通常のSQL
DB構造
モデル構築の今回はシンプルに行きます。
- database/migrations/2019_10_12_071831_create_sample.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSample extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('product', function (Blueprint $table) {
$table->bigIncrements('id');
$table->json('tag')->nullable();
$table->timestamps();
});
Schema::create('tag', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('product');
Schema::dropIfExists('tag');
}
}
- database/migrations/2019_10_12_071831_create_sample.php