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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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

2回答

2940閲覧

[laravel・MySQL] DBには保存されているが、modelからデータを取得できない

YosukeOchi

総合スコア10

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グッド

1クリップ

投稿2019/07/17 09:42

編集2019/07/17 10:53

前提・実現したいこと

Articlesテーブルに保存されているitemIDを取得し、それをもとにItemsテーブルからitemデータを取得する機構を作っています。
Article.IDの前半部分は問題なくitemIDを取得できているものの、あるタイミング(今回で言えばArticle.IDが825以降)を境に取得できなくなりました。Article.IDが825のものについては配列の途中まで取得できており、826以降については一切取得できていないため、データ量の問題かと思い試行錯誤してみたのですが、解決できなかったためご教授いただければ幸いです。

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

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 (SQL: select * from `items` where `id` in () order by FIELD(id, ))

該当のソースコード

ProductsController

1$article = new Article(); 2$article_contents = $article->getArticleFromOldDB($id); 3 4$item = new Item(); 5$items = $item->getItems($article_contents); //$article_contentsを取得できていないためエラーが起きている

Article

1public function getArticleFromOldDB($id) 2{ 3 return DB::connection('mysql')->select('select * from articles where id =' . $id)[0]; 4}

ここで欲しいのは$article_contents['item_order']です。

試したこと

前述のとおり、データ量の問題の観点から調べた結果、https://teratail.com/questions/95006等、似たような事象の方の質問・回答を参考にdatabase.configでPDOの設定を行なってみたのですが結果は変わらずでした。また返すデータ量を制限することも試みましたが、結果は同じでした。以下がdatabase.configに追記した内容及びArticleモデルを変更した内容です。

databaseConfig

1 'mysql' => [ 2 'driver' => 'mysql', 3 'url' => env('DATABASE_URL'), 4 'host' => env('DB_HOST', '127.0.0.1'), 5 'port' => env('DB_PORT', '3306'), 6 'database' => env('DB_DATABASE', 'forge'), 7 'username' => env('DB_USERNAME', 'forge'), 8 'password' => env('DB_PASSWORD', ''), 9 'unix_socket' => env('DB_SOCKET', ''), 10 'charset' => 'utf8mb4', 11 'collation' => 'utf8mb4_unicode_ci', 12 'prefix' => '', 13 'prefix_indexes' => true, 14 'strict' => true, 15 'engine' => null, 16 'options' => defined('PDO::MYSQL_ATTR_MAX_BUFFER_SIZE') //以下を追記 17 ? [ PDO::MYSQL_ATTR_MAX_BUFFER_SIZE => 20 * 1024 * 1024 ] 18 : [], 19 ],

Article

1public function getArticleFromOldDB($id) 2{ 3 return DB::connection('mysql')->select('select item_order from articles where id =' . $id); 4} //item_orderのデータのみ返すようにした

補足情報(FW/ツールのバージョンなど)

Laravel 5.8
PHP 7.2.13
MySQL 5.6

宜しくお願いいたします。

追記

Item

1public function getItems($article) 2{ 3 $items_order = explode(",", $article->item_order); 4 $items_order_concat = implode(',', $items_order); 5 return Item::whereIn('id', $items_order)->orderByRaw("FIELD(id, $items_order_concat)")->get(); //エラーの箇所です 6}

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

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

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

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

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

m.ts10806

2019/07/17 10:44

$idはわたっているのでしょうか? またわたっているとして提示のコードのSQLは直に実行して想定のデータが返ってくるのでしょうか? SQLのエラーからするとin () に渡っていないっぽいですがコード内にはin を使っている箇所が見当たりません。どこで実行されているSQLでしょうか?
YosukeOchi

2019/07/17 10:55 編集

$idは渡っている前提で構いません。 > SQLのエラーからするとin () に渡っていないっぽいですがコード内にはin を使っている箇所が見当たりません。 こちらについては追記致しましたので宜しくお願いいたします。なお、$article_idが渡れば想定しているデータは返ってきます。
guest

回答2

0

SQLインジェクションとか、リレーションを貼れとかその辺は置いといて

データ量の問題かと思い試行錯誤

と仮定するなら、limit句を使用し、先頭n行を飛ばしたら失敗する行も同じだけ後ろにずれるのか
orderByで逆転させたら反対から入って、同じぐらいの行数で落ちるのか試してみてください。

というか今回の例で言えば、1行ずつ取得しているわけだから1回の戻り値は1行しか帰ってこないはずでは・・・?
(同じ記事idの記事がなければですが)

投稿2019/07/17 14:50

mikkame

総合スコア5036

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

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

mikkame

2019/07/17 14:53

あとは try catch挟んで、catchした時に$article_contentsがどうなっているかを確認するとかね
guest

0

そもそもですが、

DB::connection('mysql')

と書く機会ってない気がします。envに定義されていて設定ファイルでmysqlを宣言しているのならなおさらかなと。

普通にDB::select()で良いのでは?
ただ、モデルでPKを取りに行くのであればfindOrFail()のほうが実装としては好ましいとは思います。

投稿2019/07/17 11:24

編集2019/07/17 11:32
m.ts10806

総合スコア80850

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問