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

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

新規登録して質問してみよう
ただいま回答率
85.39%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

3716閲覧

PHP foreachで処理をまわし、idが一致するものを取得したい  (laravelの構文? 変数->search() の処理内容が知りたい)

_jdi

総合スコア5

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/03/10 03:25

編集2020/03/10 06:30

初めて質問させていただきます。

前提・実現したいこと

テーブル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が反映されないという現象が発生しています。

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

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

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

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

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

Takumiboo

2020/03/10 03:29

ソースコードは ```PHP foreach($A as $a{ $key =... ``` という形式に編集してください。
退会済みユーザー

退会済みユーザー

2020/03/10 03:33

> $A:テーブルAの検索結果を格納した変数 > $B:テーブルBの検索結果を格納した変数 SQL で処理しましょうと思ったが
m.ts10806

2020/03/10 03:36

表示したい形でDBから出力可能なのでは? テーブル定義、サンプルデータ、表示したい形を例示してください。
_jdi

2020/03/10 04:17

Takumiboo様 ご指摘ありがとうございました◎ 修正いたしました。
_jdi

2020/03/10 04:24

asahina1979様 m.ts10806様 ご回答ありがとうございます◎ 現在自作したものではなく、既存のサイトを修正しており根本の処理をあまり変えずに 修正したいと考えております。SQLでの抽出であれば当方でも行えそうなのですが (その手があったか!とはなりました笑)今回は勉強も兼ねて、なぜこの構文で質問に記載した 現象が発生したかを突き詰めたいと考えております。
_jdi

2020/03/10 04:27

変数->seach()という構文はlaravelのクエリなのでしょうか? ネットで調べても情報がなく、他にも同様の構文でうまく取得ができてないところが見受けられるので 仕様を知りたいと思っております。
m.ts10806

2020/03/10 04:31

>変数->seach()という構文はlaravelのクエリなのでしょうか? どこを見たのかわからないですが、オブジェクト指向的にはその変数が保持しているインスタンス(クラス)がもってるメソッドなのは間違いないです。 ので、見るべきは自身のコードの方です。「Laravelのクエリ」が何を伝えたい表現かわかりませんが、機能の話であればドキュメント探せば良いですし、いずれにしてもインスタンスが保持している機能というだけですね。コード追ってください。
退会済みユーザー

退会済みユーザー

2020/03/10 04:39

そもそもこれ $key て 0 と 1 にしかならないよね。(爆
退会済みユーザー

退会済みユーザー

2020/03/10 04:44

具体的なモデル名の明示がないから回答書いても伝わるものか不安なんだよなー
_jdi

2020/03/10 04:47

m.ts10806様 ご回答ありがとうございます。 その通りですね...ない機能を使えるわけないですもんね。 もう少し探ってみます!
_jdi

2020/03/10 04:48

footbar810様 ご回答ありがとうございます。 まさしく知りたいことが書かれていそうです! つたない質問で察していただき感謝いたします◎
_jdi

2020/03/10 04:51

asahina1979様 ご回答ありがとうございます。 >そもそもこれ $key て 0 と 1 にしかならないよね。(爆 参考サイトを見始めたところですが、この辺が今回の現象に 関係している要因なような気がしてきました。 いただいた情報をもとに調査してみます!
m.ts10806

2020/03/10 04:58

>まさしく知りたいことが書かれていそうです! とはいえ、これ、日本語訳ドキュメントなので、調べて全く出てこない情報ではないんですけどね。
_jdi

2020/03/10 05:01

サイトの情報を基に調査した結果、$keyにはidが一致した場合にテーブルBのインデックスを 返すものと認識しました!ますます何故反映されないものが出るのか分からなくなってきました...
_jdi

2020/03/10 05:08

m.ts10806様 ネットでも探していたのですが、単語検索したときに出てきた情報が教えていただいた同サイトの 5.3がヒットしその中にはsearchの記述が存在しませんでした...検索方法がいまいちだったようです。
_jdi

2020/03/10 05:21

Takumiboo様 ホントですね...笑 ありがとうございます◎
_jdi

2020/03/10 06:04

Kosuke_Shibuya様 ご丁寧にありがとうございました◎ 因みに質問のような現象がなぜ起こるか分かりますか? お手数ですが分かるようであれば教えていただきたいです。 よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2020/03/10 06:07 編集

提示されている情報だけでは調べようがありません。 提示されたコードでは、1+N検索が行われるということは明らかなので、そのようなアプローチはしないと思います。
_jdi

2020/03/10 06:33

Kosuke_Shibuya様 ひとまず変数の内容を展開させていただきました。 考えられる可能性があればご指摘お願いいたします。
guest

回答3

0

ベストアンサー

Shop

idname
1店舗A
2店舗B
3店舗C

Visitors

shop_idcustomer_idvisited_datetime
1102020-03-09 12:00:00
1122020-03-09 13:00:00
292020-03-09 10:00:00
3112020-03-09 11:00:00

Shop(model)

php

1class Shop extends Model 2{ 3 public function visitors() :HasMany 4 { 5 return $this->hasMany(Visitor::class); 6 } 7}

php

1// controller 2 3$shops = Shop::withCount('visitors')->get(); 4$shops->each(function(Shop $shop){ 5 dump($shop->visitors_count); 6});

https://readouble.com/laravel/5.7/ja/eloquent-relationships.html

投稿2020/03/10 05:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

$keyの判定部分を以下のように変更したらうまくいきました!

PHP

1 if($key===false){ 2 $a->count = 0; 3 } 4 else{$a->count = $B[$key]->count; 5 } 6 7 //$a->count = $key ? $B[$key]->count : 0; 8

この度は Kosuke_Shibuya様をベストアンサーとさせていいただきました。
サイト情報を提供してくださったfoobar810様・Takumiboo様をはじめ、
他の方も回答いただきありがとうございます。

今回初めて利用し、知識・検索スキル・質問スキル等まだまだ未熟だと痛感いたしました。
諸々精進していきたいと思います。

投稿2020/03/10 07:47

編集2020/03/10 07:56
_jdi

総合スコア5

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

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

0

ダブってしまったため取り消します...

投稿2020/03/10 07:26

編集2020/03/10 07:58
_jdi

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問