ckaphp,php,mysqlを使って、野球の打席結果の集計をして表示するアプリを作成中です。インストラクターの方にコードを教えていただき、入力したのですが、ソースコードの解読ができず、どのような命令なのかあまり分かっていないので解説をお願いします。
2行目の $games = $table->find()->where("gameday like '".$this->request->getQuery("k")."%'")->all();からの解説をお願いします。
該当のソースコード
cakephp
1{ 2 $table = $this->getTableLocator()->get("games"); 3 $games = $table->find()->where("gameday like '".$this->request->getQuery("k")."%'")->all(); 4 $arr = "in("; 5 $arr1 = ""; 6 foreach ($games as $g) { 7 $arr.=$g->id.","; 8 } 9 if ($arr!="in("){ 10 $arr = rtrim($arr,",").")"; 11 $arr1 = " where id ".$arr; 12 $arr2 = $arr; 13 $arr = " where gameid ".$arr; 14 $arr3 = ""; 15 } else { 16 $arr = ""; 17 $arr2 = ""; 18 }
試したこと
googleでinの検索
インストラクターへの質問をして
補足情報(FW/ツールのバージョンなど)
インストラクターの回答
$games = $table->find()->where("gameday like '".$this->request->getQuery("k")."%'")->all();
sql部分だけ見ると
gameday like '".$this->request->getQuery("k")."%'")
like文は曖昧一致という意味で、 後ろに書かれたものが文字列にあるかどうかを調べる
この場合、$this->request->getQuery("k")には、2019や2020が入っているので、それが連結されます。
よって、2020の場合、
gameday like '2020%'
となりますね。
%は、なんでもいいので文字があるということで、
前に書けば、途中のものも取ってこれる。
後ろに書けば2020で始まるものという意味。
そのため、 2020%なので、 2020-01-01 は一致します。 2020-12-31 も一致します。
まずinですが、その値があるかどうかを調べるも。
gameid in (1,2,3,4,5,6,7)
とすると、gameidが1か2か3か4か5か6か7のもののみ取得。
それを踏まえて、
$arr = "in(";
初期値に "in ("を入れておく。
$arr1を初期化。
$arr1 = "";
絞り込んだ$gamesデータをforeachで回し、その1行1行を$gに入れる。
foreach ($games as $g) {
$arr.=$g->id.",";
}
idを連結していきます。
in (1,3,4,7,9,10, のような感じになる。
if ($arr!="in("){
$arrがin( 以外のとき、つまりはforeachに一回は入った時の処理。
$arr = rtrim($arr,",").")";
最後の1文字を削除します。最後が','だったら削除といった感じ。
in (1,3,4,7,9,10, こんな感じになっているので、最後の,を消し、")"を.で連結している。。
$arr1 = " where id ".$arr;
文字列連結。
この時点で、$arr1は、
where id in (1,3,4,7,9,10) のようになる。
$arr2 = $arr;
バックアップ。
$arr = " where gameid ".$arr;
同じように連結。
where gameid in (1,3,4,7,9,10) のようになる。
$arr3の初期化。
$arr3 = "";
$arrがin( のとき、つまりはforeachに一回も入っていない時の処理。
} else { $arr = ""; $arr2 = ""; }
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー