Postgresを使ってLaravel + Model + JSONを使う

Postgresを使ってLaravel + Model + JSONを使う

Twitter LINEで送る Facebook はてなブログ

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