初めて質問させていただきます。
前提・実現したいこと
テーブルAより店舗情報を取得、テーブルBにて各店舗の来店者数を集計し、
テーブルAに来客者数のカラムを結合し、配列形式で返したい。
発生している問題・エラーメッセージ
プログラム上エラーは発生しないが、一部両テーブルに存在するのに
テーブルBの内容が反映されないレコードが存在する
該当のソースコード
一部抜粋
```PHP foreach($A as $a{ $key = $B->search(function($item, $key) use($A){ return $item->id==$a->id; }); $a->count = $key ? $B[$key]->count : 0; } return compact('list');
補足 $A:テーブルAの検索結果を格納した変数 $B:テーブルBの検索結果を格納した変数 この構文の直前に$Bのデータ取得処理が記載されています。 $key = $テーブルB->search(function($item, $key) use($A){ return $item->id==$A->id; }); ↑この部分の処理がいまいち分かりません。($aのidが$Bに存在するか判定し、存在する場合$Bのインデックスを返してると推測しています) ↓ 想定していた動作をしておりました。 ### 試したこと いろいろ試した結果、原因はわかりませんがテーブルBの1行目のidがうまく結合されないということが分かっております。(0が返される) ($B取得時にorderByをかけると反映されない箇所が変化する) よろしくお願いいたします。 追記 $Aに格納されているデータ(カラムは他にもありますが割愛します) |id|name|post|etc| |:--|:--:|--:|--:| |264|...|...|...| |212|...|...|...| |265|...|...|...| |431|...|...|...| |266|...|...|...| |267|...|...|...| |268|...|...|...| |269|...|...|...| |379|...|...|...| |323|...|...|...| |435|...|...|...| |374|...|...|...| |375|...|...|...| |383|...|...|...| $Bに格納されているデータ |id|count| |:--|:--:| |383|43| |435|15| |323|13| |375|28| |374|63| |268|8| |266|397| |264|23| |431|24| |265|29| データの中身はcount以外割愛しておりますが並び順は実データと同じになっております。 このデータパターンの際にid:383が反映されないという現象が発生しています。
ソースコードは
```PHP
foreach($A as $a{
$key =...
```
という形式に編集してください。
> $A:テーブルAの検索結果を格納した変数
> $B:テーブルBの検索結果を格納した変数
SQL で処理しましょうと思ったが
表示したい形でDBから出力可能なのでは?
テーブル定義、サンプルデータ、表示したい形を例示してください。
Takumiboo様
ご指摘ありがとうございました◎
修正いたしました。
asahina1979様 m.ts10806様
ご回答ありがとうございます◎
現在自作したものではなく、既存のサイトを修正しており根本の処理をあまり変えずに
修正したいと考えております。SQLでの抽出であれば当方でも行えそうなのですが
(その手があったか!とはなりました笑)今回は勉強も兼ねて、なぜこの構文で質問に記載した
現象が発生したかを突き詰めたいと考えております。
変数->seach()という構文はlaravelのクエリなのでしょうか?
ネットで調べても情報がなく、他にも同様の構文でうまく取得ができてないところが見受けられるので
仕様を知りたいと思っております。
>変数->seach()という構文はlaravelのクエリなのでしょうか?
どこを見たのかわからないですが、オブジェクト指向的にはその変数が保持しているインスタンス(クラス)がもってるメソッドなのは間違いないです。
ので、見るべきは自身のコードの方です。「Laravelのクエリ」が何を伝えたい表現かわかりませんが、機能の話であればドキュメント探せば良いですし、いずれにしてもインスタンスが保持している機能というだけですね。コード追ってください。
seach() Collectionクラス(便利な配列みたいなもの)のメソッドです。
クエリを実行しその結果が複数件のものはCollectionクラスで取得されます。
https://readouble.com/laravel/5.5/ja/collections.html#method-search
そもそもこれ $key て 0 と 1 にしかならないよね。(爆
具体的なモデル名の明示がないから回答書いても伝わるものか不安なんだよなー
m.ts10806様
ご回答ありがとうございます。
その通りですね...ない機能を使えるわけないですもんね。
もう少し探ってみます!
footbar810様
ご回答ありがとうございます。
まさしく知りたいことが書かれていそうです!
つたない質問で察していただき感謝いたします◎
asahina1979様
ご回答ありがとうございます。
>そもそもこれ $key て 0 と 1 にしかならないよね。(爆
参考サイトを見始めたところですが、この辺が今回の現象に
関係している要因なような気がしてきました。
いただいた情報をもとに調査してみます!
>まさしく知りたいことが書かれていそうです!
とはいえ、これ、日本語訳ドキュメントなので、調べて全く出てこない情報ではないんですけどね。
サイトの情報を基に調査した結果、$keyにはidが一致した場合にテーブルBのインデックスを
返すものと認識しました!ますます何故反映されないものが出るのか分からなくなってきました...
m.ts10806様
ネットでも探していたのですが、単語検索したときに出てきた情報が教えていただいた同サイトの
5.3がヒットしその中にはsearchの記述が存在しませんでした...検索方法がいまいちだったようです。
Laravel5.3でもありますけどね…。
https://readouble.com/laravel/5.3/ja/collections.html#method-search
Takumiboo様
ホントですね...笑
ありがとうございます◎
Kosuke_Shibuya様
ご丁寧にありがとうございました◎
因みに質問のような現象がなぜ起こるか分かりますか?
お手数ですが分かるようであれば教えていただきたいです。
よろしくお願いいたします。
提示されている情報だけでは調べようがありません。
提示されたコードでは、1+N検索が行われるということは明らかなので、そのようなアプローチはしないと思います。
Kosuke_Shibuya様
ひとまず変数の内容を展開させていただきました。
考えられる可能性があればご指摘お願いいたします。
回答3件
あなたの回答
tips
プレビュー