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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

8922閲覧

複数の配列データを一括でDBに書き込む方法

supermaruetsu

総合スコア148

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2017/06/27 06:02

編集2017/06/27 06:37

表題のように、PHPで複数の配列データを一括でDBにinsertする方法が分かりません。F/Wはlaravel5.4を使用しています。
流れを説明しますと、

① controllerから$dataに纏められたお気に入り記事一覧がServiceクラスへ

php

1// retuurn dd($data); from TestController 2 3array:20 [ 4 0 => array:3 [ 5 "title" => "気になる話" 6 "link" => "http://blogfall.com/post-21402/" 7 "img" => "http://img.blogfall.com/wp-content/uploads/2017/06/mf9207-200x112.jpg" 8 ] 9 1 => array:3 [ 10 "title" => "難しかった歌" 11 "link" => "http://blogfall.com/post-21434/" 12 "img" => "http://img.blogfall.com/wp-content/uploads/2017/06/mf9215-200x112.jpg" 13 ] 14 2 => array:3 [ 15 "title" => "youtuberの年収" 16 "link" => "http://blogfall.com/post-21386/" 17 "img" => "http://img.blogfall.com/wp-content/uploads/2017/06/mf9203-200x112.jpg" 18 ] 19 3 => array:3 [ 20 "title" => "梅雨を乗り切る元気な音楽" 21 "link" => "http://blogfall.com/post-21382/" 22 "img" => "http://img.blogfall.com/wp-content/uploads/2017/06/mf9202-200x112.jpg" 23 ] 24 //...続く 25 26]

② 次に、受け取った$dataを1件ずつ1行にinsertしていく

id | title | link | img | 1 | "気になる話" | "http://blogfall.com/post-21402/" | "http://img.blogfall.com/wp-content/uploads/2017/06/mf9207-200x112.jpg" | 2 | "難しかった歌" | .....

この2番を行うために必要なCodeがわかりません。
初歩的な質問かもしれませんが、どうぞよろしくお願いいたします。

※補足になります。
単体であれば、おそらくですが下記のようなCodeでいけるはずです。

php

1<?php 2 3namespace App\Services; 4 5use App\Models\Article; 6 7class ArticleService 8{ 9 /** 10 * @param array $data 11 * @return Article 12 */ 13 public function store(array $data) 14 { 15 $article = new Article; 16 $article->title = $data['title']; 17 $article->url = $data['url']; 18 $article->img_path = $data['img']; 19 $article->save(); 20 21 return $article; 22 } 23 24}

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

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

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

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

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

m.ts10806

2017/06/27 06:19 編集

ちなみに単体でinsertはできていますか?(できましたらその辺りのコードもご提示ください)
guest

回答1

0

ベストアンサー

laravelのマニュアルそのままになってしまって、恐縮ですが配列の配列をinsertに渡して呼び出すことで、テーブルにたくさんのレコードを一度にまとめて挿入できます。
参考URL(Insertを参照)

PHP

1DB::table('users')->insert([ 2 ['email' => 'taylor@example.com', 'votes' => 0], 3 ['email' => 'dayle@example.com', 'votes' => 0] 4]);

framework側のInsertメソッド(スイマセン。Ver 5.3ですが、たぶん変わらないはず)

PHP

1 /** 2 * Compile an insert statement into SQL. 3 * 4 * @param \Illuminate\Database\Query\Builder $query 5 * @param array $values 6 * @return string 7 */ 8 public function compileInsert(Builder $query, array $values) 9 { 10 // Essentially we will force every insert to be treated as a batch insert which 11 // simply makes creating the SQL easier for us since we can utilize the same 12 // basic routine regardless of an amount of records given to us to insert. 13 $table = $this->wrapTable($query->from); 14 15 if (! is_array(reset($values))) { 16 $values = [$values]; 17 } 18 19 $columns = $this->columnize(array_keys(reset($values))); 20 21 // We need to build a list of parameter place-holders of values that are bound 22 // to the query. Each insert should have the exact same amount of parameter 23 // bindings so we will loop through the record and parameterize them all. 24 $parameters = []; 25 26 foreach ($values as $record) { 27 $parameters[] = '('.$this->parameterize($record).')'; 28 } 29 30 $parameters = implode(', ', $parameters); 31 //ここ! 32 return "insert into $table ($columns) values $parameters"; 33 } 34

投稿2017/06/27 06:41

編集2017/06/27 07:27
motuo

総合スコア3027

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

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

supermaruetsu

2017/06/27 06:50 編集

ありがとうございます。挿入は一回でやれるとしても、データの作成はやはり一つづつ、といった感じですよね。 一気に100件とかでデータを作り、一回で入れ込むことはできないのでしょうか?
motuo

2017/06/27 07:29 編集

ごめんなさい。「挿入は一回でやれるとしても、データの作成はやはり一つづつ」の意味が正確に分かりませんでした。 ↓↓とりあえず、Insertの処理をループしたくない、という理解で受け止めています↓↓ framework側の処理では、Insert文は一回だと思います。ループでは回していません。 Illuminate\Database\Query\GrammarsのcompileInsertのreturnを確認してみましょう。 (回答に追記しておきます。。)
supermaruetsu

2017/07/23 15:59

返答が遅くなり申し訳ありませんでした。頂いた回答を基に解決することが出来ました!ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問