自主勉強がてらにLaravelでECサイトを作ってみようと思っているのですが、決済の処理を実装しようにも肝心の商品をデータとして用意する必要があります。
PHPではFakerを使って電話番号やメールアドレスと言った仮のデータを作ることが出来ますが、商品に関する仮データには対応していない様だったので作り方をざっとまとめます。
*基本的な処理や画面はLaravel学習帳の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アプリの作成(一覧)
CSVファイルの特定の列を取り出す
商品データを作る前にやっておきたいこと
仮のデータを用意しておき、その後SQL文で商品データを上書きする形を取ります。
その為、先にFakerで仮データを入れておきます。
仮データの作成
テーブル「goods」のデータ形式
下記の様な構成のテーブルを用意する予定です。(id、作成日時、更新日時は除く。)
カラム名 | データ型 |
---|---|
商品コード | 文字列 |
商品名 | 文字列 |
規格 | 文字列 |
価格 | 数値 |
メーカー | 文字列 |
発売日 | 日付 |
取扱日 | 日付 |
テーブルの作成
[root@87c2be02241a shop]# php artisan make:migration create_goods_table
Created Migration: 2018_10_21_172119_create_goods_table
上記のデータ形式に沿ってテーブル定義を書きます。
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実行
[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を作ります。
[root@87c2be02241a shop]# php artisan make:model Models/Goods
Model created successfully.
Modelでは更新対象のカラムを指定しておきます。
class Goods extends Model
{
public $timestamps = true;
protected $fillable = [
'goods_code',
'goods_name',
'standard',
'price',
'maker',
'release_date',
'handling_date',
'updated_at'
];
}
ModelFactoryの作成
[root@87c2be02241a shop]# php artisan make:factory GoodsFactory
Factory created successfully.
Fakerのリファレンスを参考に、作成したfactoryファイル(GoodsFactory.php)を修正します。
*Modelの指定の仕方に注意してください。
$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)を作成します。
[root@87c2be02241a shop]# php artisan make:seed GoodsTableSeeder
Seeder created successfully.
「GoodsTableSeeder」の編集を行います。
今回は100行分の商品データを作ります。
*ここもModelの指定に注意してください。
public function run()
{
factory(\App\Models\Goods::class, 100)->create();
}
シーダー実行の為に「DatabaseSeeder.php」の編集を行います。
public function run()
{
$this->call(GoodsTableSeeder::class);
}
シーダー実行
[root@87c2be02241a shop]# php artisan db:seed
Seeding: GoodsTableSeeder
これで一旦の仮データが作成されます。
商品データの作成
今度は実際にECサイト上で利用したい商品データを作って行きます。
CSVファイルの作成
商品のダミーデータはSmartDataさんにて作成します。
こちらではデフォルトで、
カラム名 |
---|
商品コード |
商品名 |
規格 |
価格 |
メーカー |
発売日 |
のダミーデータを作成することが出来ます。 |
これに、「id」「取扱日」あたりをカラムとして合わせてデータを作成すればそれなりの商品データが作れそうです。 |
まずはテストデータ生成ページの「サンプル(商品データ)を呼び出す場合はこちら」を押下します。

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

カラム内の「削除」を押下し、一旦ルール設定を削除(空白)します。
次に「オブジェクト定義」の「Step2.[オブジェクト生成]」タブ内「数値」プルダウンを押下します。
プルダウン内の「数値_1」を選択します。
「最小値」、「最大値」等を任意の数字に合わせ、「登録」ボタンを押下します。

次に「Step3.[ルール設定]」タブを押下します。
「数値_1」行の「数値」を押下します。
すると、「テストデータ定義」のルール設定にも「数値_1.数値」のルールが適用される様になります。

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


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

「開始年月日」、「終了年月日」等を任意の数字に合わせ、「登録」ボタンを押下します。
次にStep3.[ルール設定]」タブを押下します。
「日付_1」行のプルダウンリストを押下します。
プルダウンリスト内の「Y/m/d H:i:s」のフォーマットを選択します。

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

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

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

シェルスクリプトによる SQLファイルの作成
CSVファイルは下記の様になっています。

このデータを用いてシェルスクリプトでupdate用のSQL文を作ります。
まずはデータの整形を行います。
CSVデータの整形
エディターでダウンロードしたCSVファイルを開き、スペースを置換します。
また、「発売日」データに含まれている「/」を「-」に置換します。
*スペースを空白で置き換えると、日付と時間の間のスペースも無くなってしまいますが、これはこのままで大丈夫です。
整形後は以下の様な形になります。
HIM001,みんなのガーリック,350g,5870,株式会社ダミーネット・メディエク化成工業,2016-01-1207:29:05
置き換え後のデータを「update_data.csv」とでもリネームしておきましょう。
シェルスクリプトの作成
CSVデータを元にupdate文のSQLファイルを作るシェルスクリプトを作成ます。
# !/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」が作成されます。
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ファイルを読み込ませます。
[root@87c2be02241a laravel]# mysql -uユーザー名 -p shop1 < update_goods.sql
これにてデータが更新されます。
画面で簡単に出力するとこんな感じになります。

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