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

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

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

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

PHP

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

Q&A

解決済

1回答

592閲覧

APIのデータが思った通りにテーブルに保存することが出来ず困っています。

haruatu

総合スコア89

Laravel 6

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

PHP

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

0グッド

0クリップ

投稿2022/02/07 20:37

編集2022/02/07 21:39

説明のために、お手数ですが、まず下記を読んでください。

//楽天ブックス書籍検索 $rakutenn_url = 'https://app.rakuten.co.jp/services/api/BooksBook/Search/20170404?applicationId=アプリID&page=〇(1~100の数字を入れる)';

上述のAPIがjson形式だったため

$rakutenn_json = $rakutenn_response->getBody()->getContents(); $rakutenn_booklist= json_decode($rakutenn_json,true);

してdd()で確認したのが下記の配列です。

array:9 [▼ "GenreInformation" => [] "Items" => array:30 [▶] ←ここに30冊分の本のデータが入っていて、"page"の数字によって内容が変わる "carrier" => 0 "count" => 920618 "first" => 1 "hits" => 30 "last" => 30 "page" => 〇(1~100の数字が入る) "pageCount" => 100 ]

質問は、上述の配列の"page"の1~100の"Items"のデータを自動的にテーブルに保存するにはどうしたらいいのかが、わからないという事です。

詳しく説明すると、まず、テーブルに保存したいのは"Items"のデータです。その為に下記のコードでテーブルにデータを保存したのですが、

$bookbook=[]; foreach($bookbook as $item) { Book::create([ 'title'=>$item['title'], 'link'=>$item['link'], 'author'=>$item['author'], 'category'=>$item['category'], 'guid'=>$item['guid'], 'isbn'=>$item['isbn'], 'booksGenreId'=>$item['booksGenreId'], 'publisherName'=>$item['publisherName'], 'largeImageUrl'=>$item['largeImageUrl']]); }

この方法だと"page"が1のデータしか保存されませんでした。一応、手動でAPIのURLの[page=〇]の〇部分に残りの2~100の数字を順番に入力して一回一回保存していけば、すべての"page"のデータが手に入るのですが、それだと面倒なので、もっと楽にどうにかできないかと考えています。

試したことは、

for($i=1;$i<=100;$i++){ $rakutenn_url = 'https://app.rakuten.co.jp/services/api/BooksBook/Search/20170404?applicationId=アプリID&page=$i'; }

とfor文でpageの部分を$iという変数にして繰り返すというのしてみたのですが、「必須パラメータが不足している」と怒られました。どうしたらいいのでしょうか?

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

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

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

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

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

takasima20

2022/02/07 21:32

いちばん下のコードはクオートが足りないようにみえます
m.ts10806

2022/02/07 21:46

シングルクォート内では変数展開されませんが、そこの認識は問題ないですか?
haruatu

2022/02/08 09:01 編集

知りませんでした。page='.strval($i);に書き換えて実行すると、「page=4でリクエスト過多です。」とおこられました。これはどうやってもpage=1~100のデータを一度に取得してテーブルに保存することは出来ないという事でしょうか?
m.ts10806

2022/02/08 09:00

Laravel使ってて変数展開知らないというのはかなりまずいかと。文字列と変数の部分です。 PHPマニュアル確認してきてください。
m.ts10806

2022/02/08 09:05

>リクエスト過多 それはAPIの仕様なのでは。 仕様書確認してきてください。
haruatu

2022/02/08 20:04

仕様書を確認した結果、APIのリクエスト数に限界があった為、諦めて手動ですることにしました。質問に答えてくださりありがとうございました。
m.ts10806

2022/02/08 21:38

質問「受付中」のままになってますので何かしらの形で経緯を記載して締めておいてください。質問者でも自己回答できます。
haruatu

2022/02/09 20:09

わかりました。
guest

回答1

0

自己解決

自己解決とは少し違いますが、

//楽天ブックス書籍検索 $rakutenn_url = 'https://app.rakuten.co.jp/services/api/BooksBook/Search/20170404?applicationId=アプリID&page=〇(1~100の数字を入れる)';

for($i=1;$i<=100;$i++){ //楽天ブックス書籍検索 $rakutenn_url = 'https://app.rakuten.co.jp/services/api/BooksBook/Search/20170404?applicationId=アプリID&page='.strval($i); }

に変更した結果、途中でリクエスト数の上限に到達しエラー(エラーナンバー429)が発生しました。これは、APIそのものの仕様であった為、諦めてすべて手動で行うことになりました。皆さん、質問に答えてくださりありがとうございました。

投稿2022/02/09 20:10

haruatu

総合スコア89

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問