前提・実現したいこと
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}