質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

2956閲覧

商品の新規作成時にフォームにない情報をidを含めた商品番号として登録したい。

ocms

総合スコア53

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/08/17 14:39

###前提・実現したいこと
Laravelを使って、商品の新規作成画面を作っております。
create から 入力値を storeに保存することはできているのですが、
formで取得した内容以外の内容を同時に保存することができません。

###発生している問題・エラーメッセージ

idを含んだ、商品番号を作成して、保存ができず困っております。

次にインクリメントされるidの取得と、idを含めた商品番号($sku)を、
createで作成する内容に含めて保存したいです。

###該当のソースコード

php

1 /** 2 * Store a newly created resource in storage. 3 * 4 * @param \Illuminate\Http\Request $request 5 * @return \Illuminate\Http\Response 6 */ 7 public function store(InventoriesCreateRequest $request) 8 { 9 $input = $request->all(); 10 // id と その他入力値を含めて商品番号を作成する 11 // $sku = $request->id.'_'.$request->asin.'_'.$request->buy_price; 12 13 14 $user = Auth::user(); 15 16 $user->inventory()->create($input); 17 18 19 return redirect('/admin/inventories'); 20 21 } 22

DB inventory
id
asin
buy_price
sku

また、ユーザーテーブルとリレーションさせていますが、こちらは問題なく動作しております。

ご教授のほどいただけますと幸いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

lightwillさんのご助言を元に、トランザクションを用いて、商品を登録後、登録したIDを取得し、SKU(商品番号)に加えて再登録させました。

トランザクションの開始時に、laravelの DB::transaction(function () { ~ を使用したかったのですが、トランザクション開始前の$request変数を持ってくることができなかったため、beginTransaction()を利用しました。

また、fagaiさんのご助言を元にSHOW TABLE STATUS LIKE 'テーブル名';を模索したのですが、LaravelでIDを取得するコードがわからなかったため、select で引っ張ってきました。
(参考元 mysql_fetch_object()などをlaravelでどう使うのかわからず断念。。)
http://blog.kamabokonet.com/2013/06/22/%E3%80%90mysqlphp%E3%80%91auto_increment%E3%81%AE%E6%AC%A1%E5%9B%9E%E5%80%A4%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/

以下、作成したコードです。
改善のご助言いただけますと大変幸いです。

お二方のご助言のおかげで、一旦動かすことができましたこと感謝の限りです!

public function store(InventoriesCreateRequest $request) { //フォームから新規商品入力値を取得 $input = $request->all(); //has manyの関係にあるユーザー情報を取得 $user = Auth::user(); //トランザクション開始 try { DB::beginTransaction(); //新規商品をDBに登録 $user->inventory()->create($input); //inventoryテーブルから登録した最新のIDを取得 $inventory_last_id = DB::select('select id from inventories order by id desc limit 1'); //取得したクラスからidを抽出 foreach ($inventory_last_id as $id) { $inventory_last_id = $id->id; } //inventoryのIDが入ったSKU(商品番号)を作成 $sku = 'test_' . $inventory_last_id; //SKUを追加更新 DB::table('inventories')->where('id', $inventory_last_id)->update(['sku' => $sku]); //コミット DB::commit(); } catch (Exception $e) { return Redirect::back(); } if (Input::get('new')){ return redirect('/admin/inventories')->with('flash_message','Inventory Added'); }elseif (Input::get('continue')){ return redirect('/admin/inventories/create/')->with('flash_message','Inventory Added'); } }

投稿2016/08/21 09:48

ocms

総合スコア53

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lightwill

2016/08/21 10:58

createメソッドは保存したモデルインスタンスを返すと思うので、 以下のようにすれば行けると思います。(動作確認はしてません。) //新規商品をDBに登録 $inventory = $user->inventory()->create($input); //inventoryのIDが入ったSKU(商品番号)を作成 $inventory->sku = 'test_' . $inventory->id; //SKUを追加更新 $inventory->save();
ocms

2016/08/21 21:52

ありがとうございます!無事にこちらでも登録ができました! >createメソッドは保存したモデルインスタンスを返すと思う だから、$inventoryに作成時のidが入るのですね。 こちらの意味がようやく腑に落ちました。ありがとうございます。
guest

0

ベストアンサー

一度skuを空で保存して、
その後にidを取得してskuを作成し、updateする。

先に次のidを取得するのは同時アクセスでズレる場合があるので、
先に保存してからidを取得するほうが確実だと思います。

ちなみに、inputに値を追加したい場合は
$request->merge(array('inputname' => 'new value'));

投稿2016/08/19 16:10

lightwill

総合スコア962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ocms

2016/08/21 09:58

lightwillさん、アドバイスありがとうございます。 今回ご助言の、トランザクションで作らせていただきました。 コードは稚拙ではありますが、なんとか動かすことができました。ありがとうございます。 >ちなみに、inputに値を追加したい場合は >$request->merge(array('inputname' => 'new value')); このやり方は、idだけ入った空のレコードに、まとめて入れるようなイメージとなりますでしょうか。
guest

0

つまり、次回入るインクリメントのIDを含めた商品IDを用意したいわけですね。
先に次に入るIDの値を取得した場合、同時にアクセスして失敗する可能性があるので1クエリに抑える必要があります。
DBがMySQLであることを前提としていますが、SHOW TABLE STATUS LIKE 'テーブル名';で情報が取得できるのでそこからインクリメントの情報を埋め込むと良いでしょう。

投稿2016/08/19 04:05

fagai

総合スコア2158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ocms

2016/08/21 09:55

fagaiさん、アドバイスありがとうございます。 show table statusから次のidを取得できるとは知らず、大変勉強になりました。 DBはmy sql となります。 DB::statement('SHOW TABLE STATUS LIKE 'テーブル名'); https://readouble.com/laravel/5.1/ja/database.html こちらで、かえってくる値が、booleanとなってしまい、インクリメント情報の取得ができず、止まってしまった次第となるのですが、良い取得方法をご助言いただけますと幸いです。 他の方へのコメントも拝見しておりまして、いつも勉強させていただいています!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問