前提・実現したいこと
GMO MakeShopを使ったアプリを運営しているのですが、商品APIから取得した商品更新日(update_date)
を元に降順に商品を表示しています。アプリの仕組みは以下のようになっています。
① 商品APIから情報取得
② DBサーバに情報格納
③ JSONファイルに出力(json_encode()使用)
④ アプリで表示
利用者の方から、「商品の入庫・出庫があったタイミングで、アプリ上の「コンテンツA(MakeShopから取得しているコンテンツ)」
の商品並び順が変わってしまう」とのことでSQL文を調査していますが、商品APIの項目に入庫日・出庫日の項目はなく、取得も
していないので、なんで並び順が変わってしまうのか調査に行き詰まっている状況です。
入庫・出庫があったタイミングでデータベース更新日updated_atが更新されて、かつjson_encode()でJSONファイルを出力してるから
JSONファイル中の商品の並び順がアプリと違う順番へ変わるのが影響しているのか?と思いましたが、
JSONファイル出力前にSQL文中の主問い合わせORDER BY句、副問い合わせORDER BY句でupdate_date(商品更新日)を指定してるので
こちらの線は薄いと思っています。
このような事象をご経験された、もしくはこのような時に確認する項目があれば、ご教示頂きたくお願いします。
該当のソースコード
sql
1# 処理概要の図のContents.phpの一部 2# JSON出力する項目 3$cols = "id,area,category,target,title,body,posted_at,link,url_image,url_video,collections"; 4 5 6$sql = "SELECT {$cols}, update_date, odr, odr2 FROM"; 7 $sql.= "("; 8 # コンテンツA 9 $sql.= "SELECT {$cols}, update_date, 1 AS odr, CASE collections WHEN 99 THEN -1 ELSE 1 END AS odr2"; 10 $sql.= " FROM contents WHERE target=1 AND category={$category} ORDER BY update_date DESC LIMIT 5"; 11 $sql.= ") AS t1"; 12 $sql.= " UNION ALL "; 13 14 # コンテンツB 15 $sql.= "SELECT {$cols}, posted_at, 1, 1 FROM"; 16 $sql.= "("; 17 $sql.= "SELECT {$cols}"; 18 $sql.= " FROM contents WHERE target=2 AND category={$category} ORDER BY posted_at DESC LIMIT 5"; 19 $sql.= ") AS t3"; 20 $sql.= " UNION ALL "; 21 22 # コンテンツC(target:11) 23 $sql.= "SELECT {$cols}, null, 13, 101 FROM"; 24 $sql.= "("; 25 $sql.= "SELECT {$cols}"; 26 $sql.= " FROM contents WHERE target=11 AND category={$category} ORDER BY posted_at DESC LIMIT 1"; 27 $sql.= ") AS t5"; 28 $sql.= " UNION ALL "; 29 30 # コンテンツD(target:12) 31 $sql.= "SELECT {$cols}, null, 12, 101 FROM"; 32 $sql.= "("; 33 $sql.= "SELECT {$cols}"; 34 $sql.= " FROM contents WHERE target=12 AND category={$category} ORDER BY posted_at DESC LIMIT 1"; 35 $sql.= ") AS t7"; 36 $sql.= " UNION ALL "; 37 38 # コンテンツE(target:13) 39 $sql.= "SELECT {$cols}, null, 11, 101 FROM"; 40 $sql.= "("; 41 $sql.= "SELECT {$cols}"; 42 $sql.= " FROM contents WHERE target=13 AND category={$category} ORDER BY posted_at DESC LIMIT 1"; 43 $sql.= ") AS t9"; 44 $sql.= " UNION ALL "; 45 46 # コンテンツF(target:14) 47 $sql.= "SELECT {$cols}, null, 14, 101 FROM"; 48 $sql.= "("; 49 $sql.= "SELECT {$cols}"; 50 $sql.= " FROM contents WHERE target=14 AND category={$category} ORDER BY posted_at DESC LIMIT 1"; 51 $sql.= ") AS t11"; 52 53 $sql.= " ORDER BY odr, odr2, update_date DESC;"; 54
php
1# 処理概要の図のExportJsonCommand.php 2<?php 3 4namespace App\Console\Commands; 5 6use Illuminate\Console\Command; 7use Illuminate\Http\Request; 8use App\Models\Contents; 9use Carbon\Carbon; 10use DB; 11 12use App\Http\Controllers\HomeController; 13 14use Monolog\Logger; 15use Monolog\Formatter\LineFormatter; 16use Monolog\Handler\StreamHandler; // one file logging 17use Monolog\Handler\RotatingFileHandler; //dairy file rotating logging 18 19/** 20 * JSON出力処理 21 * 22 */ 23class ExportJsonCommand extends Command 24{ 25 protected $description = 'DBからJSONデータを出力します'; 26 27 protected $signature = 'command:export_json'; 28 protected $logger; 29 protected $formatter; 30 31 /** 32 * Create a new command instance. 33 * 34 * @return void 35 */ 36 public function __construct() 37 { 38 parent::__construct(); 39 40 $logFile = 'logs/batch.log'; 41 42 $this->logger = new Logger($this->signature); 43 $formatter = new LineFormatter(null, null, false, true); 44 $infoHandler = new StreamHandler(storage_path() ."/". $logFile, Logger::DEBUG); 45 $infoHandler->setFormatter($formatter); 46 $this->logger->pushHandler($infoHandler); 47 } 48 49 /** 50 * Execute the console command. 51 * 52 * @return mixed 53 */ 54 public function handle(Request $request) 55 { 56 $dt = new Carbon; 57 58 # ログ出力用文字列 59 $log_body = "".$dt->format('H:i:s')."~ "; 60 61 $home = new HomeController; 62 $res = $home->outputJSON(); 63 $log_body.= "***END:".$dt->format('H:i:s'); 64 65 # バッチ処理終了ログ出力 66 $this->logger->info($log_body); 67 } 68 69 70}
アプリの処理概要
テーブル構造
補足情報(FW/ツールのバージョンなど)
AWS使用(WEB:EC2、DB:RDS Aurola)
OS:CentOS Linux release 7.7.1908
言語:PHP 7.3.15 (cli)
フレームワーク:Laravel 5.7.22
回答1件
あなたの回答
tips
プレビュー