laravel5.1にECカート操作が出来るようになったので、商品を選んで、カートに入れて、カートクリアまでやってみた。
1, 商品テーブルを作る
php artisan make:migration create_products_table –create=products
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public function up() { Schema::create('products', function (Blueprint $table) { $table->increments('id')->comment('主キー'); $table->string('product_code')->unique()->comment('商品コード 各商品に割り当てる商品コード。重複なし'); $table->string('product_name')->comment('価格 販売価格。'); $table->integer('product_price')->comment('価格 販売価格。'); $table->text('product_detail')->comment('商品詳細 その他の情報'); $table->text('product_remarks')->comment('備考 管理用備考'); $table->softDeletes(); $table->timestamps(); }); } |
2, 商品モデルも作る(laravel側からデータベースを操作するためのORマッパー)
php artisan make:model Product
app\Product.phpが生成される(コーディングは何もしなくても良い。親クラスの継承メソッドでアクセスできるようになる)
3, 商品レコード内容の定義ファイルを生成
既存のDatabaseSeeder.phpを編集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<?php use Illuminate\Database\Seeder; use Illuminate\Database\Eloquent\Model; use App\Product; // 商品テーブル // 全体のレコード生成 class DatabaseSeeder extends Seeder { public function run() { Model::unguard(); // $this->call(UserTableSeeder::class); $this->call(ProductsTableSeeder::class); Model::reguard(); } } // 商品テーブルを生成 class ProductsTableSeeder extends Seeder { public function run() { // 既存の商品レコードは全削除 DB::table('products')->delete(); // 商品を10個追加 for ($i = 0; $i < 10; $i++) { Product::create([ 'product_code' => 100+$i, 'product_name' => 'Product'. $i, 'product_price' => 100 * $i, 'product_detail' => 'detail'. $i, 'product_remarks' => 'remarks'. $i ]); } } } |
4, MySQLに反映させる。
php artisan migrate:refresh –seed
5, ブラウザに表示してみる
app/Http/route.phpファイルに追加
1 2 3 4 5 6 7 8 9 10 |
// 商品一覧 Route::get('/product', function () { //全商品を取得 $products = App\Product::all(); // ブラウザ上に表示 return $products; }); |
http://localhost/cart/public/product
[{“id”:1,”product_code”:”0″,”product_name”:”Product0″,”product_price”:0,”product_detail”:”detail0″,”product_remarks”:”remarks0″,”created_at”:”2016-10-25 01:45:11″,”updated_at”:”2016-10-25 01:45:11″},
{“id”:2,”product_code”:”1″,”product_name”:”Product1″,”product_price”:100,”product_detail”:”detail1″,”product_remarks”:”remarks1″,”created_at”:”2016-10-25 01:45:11″,”updated_at”:”2016-10-25 01:45:11″},
{“id”:3,”product_code”:”2″,”product_name”:”Product2″,”product_price”:200,”product_detail”:”detail2″,”product_remarks”:”remarks2″,”created_at”:”2016-10-25 01:45:11″,”updated_at”:”2016-10-25 01:45:11″},
{“id”:4,”product_code”:”3″,”product_name”:”Product3″,”product_price”:300,”product_detail”:”detail3″,”product_remarks”:”remarks3″,”created_at”:”2016-10-25 01:45:11″,”updated_at”:”2016-10-25 01:45:11″},
{“id”:5,”product_code”:”4″,”product_name”:”Product4″,”product_price”:400,”product_detail”:”detail4″,”product_remarks”:”remarks4″,”created_at”:”2016-10-25 01:45:11″,”updated_at”:”2016-10-25 01:45:11″},
{“id”:6,”product_code”:”5″,”product_name”:”Product5″,”product_price”:500,”product_detail”:”detail5″,”product_remarks”:”remarks5″,”created_at”:”2016-10-25 01:45:11″,”updated_at”:”2016-10-25 01:45:11″},
{“id”:7,”product_code”:”6″,”product_name”:”Product6″,”product_price”:600,”product_detail”:”detail6″,”product_remarks”:”remarks6″,”created_at”:”2016-10-25 01:45:11″,”updated_at”:”2016-10-25 01:45:11″},
{“id”:8,”product_code”:”7″,”product_name”:”Product7″,”product_price”:700,”product_detail”:”detail7″,”product_remarks”:”remarks7″,”created_at”:”2016-10-25 01:45:11″,”updated_at”:”2016-10-25 01:45:11″},
{“id”:9,”product_code”:”8″,”product_name”:”Product8″,”product_price”:800,”product_detail”:”detail8″,”product_remarks”:”remarks8″,”created_at”:”2016-10-25 01:45:11″,”updated_at”:”2016-10-25 01:45:11″},
{“id”:10,”product_code”:”9″,”product_name”:”Product9″,”product_price”:900,”product_detail”:”detail9″,”product_remarks”:”remarks9″,”created_at”:”2016-10-25 01:45:11″,”updated_at”:”2016-10-25 01:45:11″}]
6, もう少し見やすいように、見た目(View)を定義する
resources/view/product/index.blade.phpファイルを生成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<table border='1'> <thead> <tr> <th>ID</th> <th>商品コード</th> <th>商品名</th> <th>商品価格</th> <th>商品詳細</th> <th>備考</th> </tr> </thead> <tbody> @foreach($products as $product) <tr> <td>{{ $product->id }} </td> <td>{{ $product->product_code }} </td> <td>{!! link_to(action('CartController@add', ['id' => $product->id , 'qty' => 1]), $product->product_name) !!}</td> <td>{{ $product->product_price }} </td> <td>{{ $product->product_detail }} </td> <td>{{ $product->product_remarks }} </td> </tr> @endforeach </tbody> </table> |
7, 直接表示せずに、ビューに渡すようにする
1 2 3 4 5 6 7 8 9 10 11 |
// 商品一覧 Route::get('/product', function () { //全商品を取得 $products = App\Product::all(); // ブラウザ上に表示 // return $products; return view('product.index')->with(compact('products')); }); |
8, 商品名をクリックしたら、個数1個でカートに入れ、カートの状態を表示する
まず、CartControllerを生成する。
php artisan make:controller CartController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
use App\Product; // 商品情報モデル use \Cart; // カートモデル("gloudemans/shoppingcart"をComposerでインストールした。appフォルダ直下にあるわけではない) class CartController extends Controller { //カートに商品を追加する public function add($product_id, $buy_num) { //購入した商品情報を取得 $product = Product::findOrFail($product_id); // カートをクリア //Cart::destroy(); // 商品ID, 商品名, 個数, 値段, 詳細情報 Cart::add([ [ 'id' => $product->product_code, 'name' => $product->product_name, 'qty' => $buy_num, 'price' => $product->product_price, 'options' => ['product_detail' => $product->product_detail, 'product_remarks' => $product->product_remarks] ] ]); // カートの中身を返す $carts = Cart::content(); return view('cart.index')->with(compact('carts')); } //カートをリセット public function reset() { Cart::destroy(); return redirect('product'); // 商品一覧に戻る } |
9, ビューの商品名をリンク(カート追加)に変更する
1 2 |
旧) <td>{{ $product->product_name }} </td> 新) <td>{!! link_to(action('CartController@add', ['id' => $product->id , 'qty' => 1]), $product->product_name) !!}</td> |
10, カートの中身を表示するビューも作る
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
カートの内容 <table border='1'> <thead> <tr> <th>商品コード</th> <th>商品名</th> <th>商品価格</th> <th>個数</th> <th>商品詳細</th> <th>備考</th> <th>消費税</th> <th>小計</th> </tr> </thead> <tbody> @foreach($carts as $cart) <tr> <td>{{ $cart->id }} </td> <td>{{ $cart->name }} </td> <td>{{ $cart->price }} </td> <td>{{ $cart->qty }} </td> <td>{{ $cart->options->product_detail }} </td> <td>{{ $cart->options->product_remarks }} </td> <td>{{ $cart->tax * $cart->qty }} </td> <td>{{ $cart->subtotal }} </td> </tr> @endforeach </tbody> </table> <br> 合計金額 {{ Cart::total() }}円<br><br> {!! link_to('product', '買い物を続ける', ['class' => 'btn btn-primary']) !!} <button>購入</button> {!! link_to('cart/reset', 'カートクリア', ['class' => 'btn btn-primary']) !!} |
11, route.phpにルーティングを記述する(URLと処理を結びつける)
1 2 3 4 |
// カートに商品を追加(商品ID、購入個数) Route::get('/cart/add/{product_id}/{buy_num}', 'CartController@add'); // カート・リセット Route::get('/cart/reset', 'CartController@reset'); |
カート内の商品を個別に削除したり、個数変更できるようにしないとな…。