ECサイトを作る時に欲しいダミー商品データの作り方



自主勉強がてらにLaravelでECサイトを作ってみようと思っているのですが、決済の処理を実装しようにも肝心の商品をデータとして用意する必要があります。
PHPではFakerを使って電話番号やメールアドレスと言った仮のデータを作ることが出来ますが、商品に関する仮データには対応していない様だったので作り方をざっとまとめます。


*基本的な処理や画面は[Laravel学習帳](https://laraweb.net/tutorial/2791/)のCRUD処理の内容を元にしています。

# 動作環境について
OS:macOS High Sierra
version: 10.13.6
Docker(Engine):18.06.1-ce

対象ブラウザ
GoogleChrome:69以上

作成する環境
centOS:7.5
Laravel:5.6
PHP:7.2
MySQL:5.7
APache2.4

# 参考資料
[CRUDアプリの作成(一覧)](https://laraweb.net/tutorial/2791/)
[CSVファイルの特定の列を取り出す](https://qiita.com/pekepek/items/c28bc87171983d756e32)


# 商品データを作る前にやっておきたいこと
仮のデータを用意しておき、その後SQL文で商品データを上書きする形を取ります。
その為、先にFakerで仮データを入れておきます。


## 仮データの作成


### テーブル「goods」のデータ形式
下記の様な構成のテーブルを用意する予定です。(id、作成日時、更新日時は除く。)

|カラム名  |データ型  |
|---------|---------|
|商品コード  |文字列    |
|商品名    |文字列     |
|規格     |文字列      |
|価格     |数値      |
|メーカー  |文字列     |
|発売日   |日付      |
|取扱日    |日付     |


### テーブルの作成

```shell-session
[root@87c2be02241a shop]# php artisan make:migration create_goods_table
Created Migration: 2018_10_21_172119_create_goods_table
```

上記のデータ形式に沿ってテーブル定義を書きます。

```PHP
Schema::create('goods', function (Blueprint $table) {
    $table->increments('id');
    $table->string('goods_code', 6);
    $table->string('goods_name', 255);
    $table->string('standard', 255);
    $table->integer('price');
    $table->string('maker', 255);
    $table->timestamp('release_date')->nullable();
    $table->timestamp('handling_date')->nullable();
    $table->timestamps();
});
```

### migration実行

```shell-session
[root@87c2be02241a shop]# php artisan migrate
Migrating: 2018_10_21_172119_create_goods_table
Migrated:  2018_10_21_172119_create_goods_table
```

これで「goods」テーブルが作成されます。

### Modelを作成
仮データを作る為にまずModelを作ります。

```shell-session
[root@87c2be02241a shop]# php artisan make:model Models/Goods
Model created successfully.
```

Modelでは更新対象のカラムを指定しておきます。

```PHP
class Goods extends Model
{
    public $timestamps = true;
    protected $fillable = [
        'goods_code',
        'goods_name',
        'standard',
        'price',
        'maker',
        'release_date',
        'handling_date',
        'updated_at'
    ];
}
```

### ModelFactoryの作成

```shell-session
[root@87c2be02241a shop]# php artisan make:factory GoodsFactory
Factory created successfully.
```

[Fakerのリファレンス](https://github.com/fzaninotto/Faker)を参考に、作成したfactoryファイル(GoodsFactory.php)を修正します。
*Modelの指定の仕方に注意してください。

```PHP
$factory->define(App\Models\Goods::class, function (Faker $faker) {
    return [
        'goods_code' => $faker->unique()->bothify('???###'),
        'goods_name' => $faker->unique()->lexify('Goods????'),
        'standard' => $faker->unique()->bothify('###???'),
        'price' => $faker->unique()->numberBetween($min = 800, $max = 20000),
        'maker' => $faker->unique()->company,
        'release_date' => $faker->unique()->dateTimeThisMonth($max = 'now', $timezone = 'Asia/Tokyo'),
        'handling_date' => $faker->unique()->dateTimeBetween($startDate = '-5 days', $endDate = 'now', $timezone = 'Asia/Tokyo')
    ];
});
```


### シーダーファイルの作成
仮データを挿入するシーダーファイル(GoodsTableSeeder.php)を作成します。

```shell-session
[root@87c2be02241a shop]# php artisan make:seed GoodsTableSeeder
Seeder created successfully.
```

「GoodsTableSeeder」の編集を行います。
今回は100行分の商品データを作ります。
*ここもModelの指定に注意してください。

```PHP
public function run()
{
    factory(\App\Models\Goods::class, 100)->create();
}
```


シーダー実行の為に「DatabaseSeeder.php」の編集を行います。

```PHP
public function run()
{
    $this->call(GoodsTableSeeder::class);
}
```

### シーダー実行

```shell-session
[root@87c2be02241a shop]# php artisan db:seed
Seeding: GoodsTableSeeder
```

これで一旦の仮データが作成されます。


![20181029_1.png](https://qiita-image-store.s3.amazonaws.com/0/238861/eec5c79d-30cc-0412-dae6-b2876e16b855.png)




# 商品データの作成
今度は実際にECサイト上で利用したい商品データを作って行きます。

## CSVファイルの作成
商品のダミーデータは[SmartData](http://roopidea.com/smartdata/index.php)さんにて作成します。
こちらではデフォルトで、

|カラム名  |
|---------|
|商品コード  |
|商品名    |
|規格     |
|価格     |
|メーカー  |
|発売日   |
のダミーデータを作成することが出来ます。
これに、「id」「取扱日」あたりをカラムとして合わせてデータを作成すればそれなりの商品データが作れそうです。


まずは[テストデータ生成](http://roopidea.com/smartdata/index.php)ページの「サンプル（商品データ）を呼び出す場合はこちら」を押下します。


<img width="821" alt="20181029_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/238861/f2958e93-acfb-7bf1-3c37-36d03d767737.png">



「テストデータ定義」の「Step1.[構造設定]」タブ内「ルール設定/書式設定」カラムを編集します。
「価格」行の「ルール設定/書式設定」列を押下すると背景が水色に変化します。


<img width="823" alt="20181029_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/238861/a1130de4-d3c4-d9a3-f1ec-790c83787c05.png">


カラム内の「削除」を押下し、一旦ルール設定を削除(空白)します。

次に「オブジェクト定義」の「Step2.[オブジェクト生成]」タブ内「数値」プルダウンを押下します。
プルダウン内の「数値_1」を選択します。

「最小値」、「最大値」等を任意の数字に合わせ、「登録」ボタンを押下します。


<img width="862" alt="20181029_4.png" src="https://qiita-image-store.s3.amazonaws.com/0/238861/7cf6dac7-29bf-6ca1-8c42-e406f4ad69d5.png">



次に「Step3.[ルール設定]」タブを押下します。
「数値_1」行の「数値」を押下します。


![20181029_5.png](https://qiita-image-store.s3.amazonaws.com/0/238861/e91e9d8c-c08c-a3df-7162-70474e0e97c0.png)




すると、「テストデータ定義」のルール設定にも「数値_1.数値」のルールが適用される様になります。


<img width="875" alt="20181029_6.png" src="https://qiita-image-store.s3.amazonaws.com/0/238861/bda3face-7cbe-ab8d-bf75-1c3829ebcf5f.png">




同様に、日付のフォーマットも編集します。
「発売日」行の「ルール設定/書式設定」列を押下し、既存のルール設定を削除します。


<img width="815" alt="20181029_7.png" src="https://qiita-image-store.s3.amazonaws.com/0/238861/2469f9d6-06ff-aa0c-ae6e-f0c618b5f64a.png">


<img width="820" alt="20181029_8.png" src="https://qiita-image-store.s3.amazonaws.com/0/238861/6abab3ac-558b-e690-3f20-aca515e9eece.png">


続けて「オブジェクト定義」の「Step2.[オブジェクト生成]」タブ内「日付」プルダウンを押下します。
プルダウン内の「日付_1」を選択します。


<img width="824" alt="20181029_9.png" src="https://qiita-image-store.s3.amazonaws.com/0/238861/68c23b74-8ca6-6114-12cb-596bfd57129e.png">




「開始年月日」、「終了年月日」等を任意の数字に合わせ、「登録」ボタンを押下します。

次にStep3.[ルール設定]」タブを押下します。
「日付_1」行のプルダウンリストを押下します。
プルダウンリスト内の「Y/m/d H:i:s」のフォーマットを選択します。


<img width="735" alt="20181029_10.png" src="https://qiita-image-store.s3.amazonaws.com/0/238861/3b6f0ab5-e757-1820-6492-edb9a66b929b.png">


「日付_1」行の「カラムに設定する」を押下します。


<img width="820" alt="20181029_11.png" src="https://qiita-image-store.s3.amazonaws.com/0/238861/fd158987-5f71-9574-7943-ea7c033492af.png">


これで「発売日」のルール設定が出来ました。


<img width="821" alt="20181029_12.png" src="https://qiita-image-store.s3.amazonaws.com/0/238861/e4024d79-3f9f-a4ef-d692-9634b8fef601.png">



最後は「テストデータ定義」の「Step4.[出力設定]」タブを押下します。
「出力形式」を「CSV形式で保存」に選択して、
「出力件数」を「100」
にし、「実行」ボタンを押下してCSVファイルをダウンロードします。

<img width="519" alt="20181029_13.png" src="https://qiita-image-store.s3.amazonaws.com/0/238861/26e0a692-0993-09ab-4571-090d2c023034.png">

## シェルスクリプトによる SQLファイルの作成

CSVファイルは下記の様になっています。

<img width="707" alt="20181029_14.png" src="https://qiita-image-store.s3.amazonaws.com/0/238861/62265c4f-0551-234d-de27-d051ed95a506.png">


このデータを用いてシェルスクリプトでupdate用のSQL文を作ります。
まずはデータの整形を行います。

### CSVデータの整形
エディターでダウンロードしたCSVファイルを開き、スペースを置換します。

また、「発売日」データに含まれている「/」を「-」に置換します。
*スペースを空白で置き換えると、日付と時間の間のスペースも無くなってしまいますが、これはこのままで大丈夫です。

整形後は以下の様な形になります。

```shell-session
HIM001,みんなのガーリック,350g,5870,株式会社ダミーネット・メディエク化成工業,2016-01-1207:29:05
```

置き換え後のデータを「update_data.csv」とでもリネームしておきましょう。

### シェルスクリプトの作成
CSVデータを元にupdate文のSQLファイルを作るシェルスクリプトを作成ます。

```shell-session
#!/bin/sh

CSV_FILE=update_data.csv
id=1

# DB
TABLE_NAME="shop1.goods"
GOODS_CODE="goods_code"
GOODS_NAME="goods_name"
STANDARD="standard"
PRICE="price"
MAKER="maker"
RELEASE_DATE="release_date"


for line in `cat ${CSV_FILE}`
do
  colmun1=`echo ${line} | cut -d ',' -f 1`
  colmun2=`echo ${line} | cut -d ',' -f 2`
  colmun3=`echo ${line} | cut -d ',' -f 3`
  colmun4=`echo ${line} | cut -d ',' -f 4`
  colmun5=`echo ${line} | cut -d ',' -f 5`
  colmun6=`echo ${line} | cut -d ',' -f 6`

SENTENCE=$(cat << EOS
UPDATE ${TABLE_NAME} 
SET ${GOODS_CODE}="${colmun1}", 
${GOODS_NAME}="${colmun2}", 
${STANDARD}="${colmun3}", 
${PRICE}=${colmun4}, 
${MAKER}="${colmun5}", 
${RELEASE_DATE}="${colmun6:0:10} ${colmun6:10:8}" 
WHERE id="${id}";
EOS
)

  echo ${SENTENCE} >> update_goods.sql
  id=$(( id + 1 ))
done
```

このスクリプトを実行すると、下記の様な「update_goods.sql」が作成されます。

```SQL
UPDATE shop1.goods SET goods_code="HIM001", goods_name="みんなのガーリック", standard="350g", price=5870, maker="株式会社ダミーネット・メディエク化成工業", release_date="2016-01-12 07:29:05" WHERE id="1";
```


## SQLの実行

商品データの作成も最後です。
作成したSQLファイルを読み込ませます。

```shell-session
[root@87c2be02241a laravel]# mysql -uユーザー名 -p shop1 < update_goods.sql
```


これにてデータが更新されます。
画面で簡単に出力するとこんな感じになります。

<img width="677" alt="20181029_last.png" src="https://qiita-image-store.s3.amazonaws.com/0/238861/d0ee1727-4641-4634-34a8-3ac5b277bcbe.png">



商品データの作成は以上となります。
このデータを利用してCRUD処理が出来る様にコードを書いていけば個人でも擬似的なECサイトが出来そうです。