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

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

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

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

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

Q&A

1回答

90閲覧

laravelにてテーブル結合後にIDレコードの内容を表示したい

tocoyu-ka22

総合スコア0

Laravel

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

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

0グッド

0クリップ

投稿2024/04/21 16:35

実現したいこと

Laravel 8.83.6
Laravel初学者です。質問内容にて稚拙な表現や内容が分かりにくい箇所が多々あるかと思います。
不足の情報等ありましたら指摘いただけますと幸いです。

フリマアプリを開発中です。
商品一覧画面から詳細画面を表示する際、商品情報を複数テーブルからIDが一致するデータを取得し表示しようと考えています。

発生している問題・分からないこと

複数テーブルを結合しIDからレコードを抽出する方法を調べ実装したところ、問題なく実装でき画面はエラーなく表示されるのですが、内容が表示されず空白になってしまいます。

該当のソースコード

Controller

1public function itemdata(Request $request) 2 { 3 $sort = $request->sort; 4 $order = $request->order; 5 6 $items = Item::select() 7 ->leftjoin('categories','categories.id','=','items.category_id') 8 ->where('item_id',$request->item_id) 9 ->get(); 10 11 $item = Item::select() 12 ->leftjoin('conditions','conditions.id','=','items.condition_id') 13 ->where('item_id',$request->item_id) 14 ->get(); 15 16 return view('detail', compact('item')); 17 } 18 19 public function detail($id) 20 { 21 $item = Item::find($id); 22 return view('detail', compact('item')); 23 }

View

1<p class="category__content">{{ $item->category }}</p> 2<p class="condition__content">{{ $item->condition }}</p>

Model

1class Item extends Model 2{ 3 use HasFactory; 4 5 protected $table = 'items'; 6 7 protected $primaryKey = 'id'; 8 9 10 public function categories() 11 { 12 return $this->belongsTo('App\Category'); 13 } 14 15 public function conditions() 16 { 17 return $this->belongsTo('App\Condition'); 18 } 19 20 public function findAllItems() 21 { 22 return Item::all(); 23 } 24 25} 26 27 28class Category extends Model 29{ 30 use HasFactory; 31 32 public function items() 33 { 34 return $this->hasMany('App\Item'); 35 } 36} 37 38 39class Condition extends Model 40{ 41 use HasFactory; 42 43 public function items() 44 { 45 return $this->hasMany('App\Item'); 46 } 47}

Migrations

1 public function up() 2 { 3 Schema::create('items', function (Blueprint $table) { 4 $table->id(); 5 $table->string('name'); 6 $table->integer('price'); 7 $table->string('brand'); 8 $table->string('description'); 9 $table->string('img_url'); 10 $table->foreignId('user_id')->constrained()->cascadeOnDelete(); 11 $table->foreignId('category_id')->constrained()->cascadeOnDelete(); 12 $table->foreignId('condition_id')->constrained()->cascadeOnDelete(); 13 $table->timestamp('created_at')->useCurrent()->nullable(); 14 $table->timestamp('updated_at')->useCurrent()->nullable(); 15 }); 16 } 17 18 19 public function up() 20 { 21 Schema::create('categories', function (Blueprint $table) { 22 $table->id(); 23 $table->string('category'); 24 $table->timestamp('created_at')->useCurrent()->nullable(); 25 $table->timestamp('updated_at')->useCurrent()->nullable(); 26 }); 27 } 28 29 30public function up() 31 { 32 Schema::create('conditions', function (Blueprint $table) { 33 $table->id(); 34 $table->string('condition'); 35 $table->timestamp('created_at')->useCurrent()->nullable(); 36 $table->timestamp('updated_at')->useCurrent()->nullable(); 37 }); 38 }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

https://qiita.com/philhiroki/items/06dd763417973d25653a
https://dad-union.com/php/1521

上記サイトを参考に実装しました。
他にも複数のサイトを調べ参考にした部分もあるため、上記サイトに記載のないコード等も記載しております。
複数の方法で何度も実装しましたが、結果はどれも同じでした。
そのため、マイグレーションファイルやシーダーファイルの不備かと考えましたが、見返してもおかしい箇所が見つかりません。
内容が分かりづらくて申し訳ありません、どなたかご教示いただけますと幸いです。

補足

特になし

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

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

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

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

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

guest

回答1

0

質問者全員に共通してるけどとにかく参考にしてる情報の探し方がおかしい。
こんなのどこからどうやって探してきたのか。
Laravel5.3、2018年ってことは見れば分かる。
Laravel8、2024年に読んでも何の参考にもならない。
「時間経過で記事の内容が古くなった」ではなく「記事が書かれた当時でも間違ってる」
最初から完全に間違ってる情報を参考にしても間違った使い方しか覚えられない。
https://qiita.com/philhiroki/items/06dd763417973d25653a

Laravelのデータベース機能にはQuery BuilderとEloquentがある。
leftjoinとか使ってる人はこの区別が付いてない。
DB::table('items')はQuery Builder。
Item::はEloquent。
Eloquentから始めてもQuery Builderに繋がるのでItem::select()->leftjoin()も問題なく動く。
この問題なく動くってのが混乱の元で理解してない人でもなんとなくで使えてしまう。
Laravelには「これでも動くけどもっといい使い方がある」って要素が大量にある。
相当使い込まないと分からない。
Query BuilderはSQLの知識だけあれば使えるので動けばいいレベルの初心者が安易に選んでしまう。

Item内の書き方だけで有名な「読んではいけない本」を読んでると分かる。
あの本で入り口段階で間違ったことを覚えた人に一から教えるのは無理なので公式ドキュメントを全ページ読むところからやり直して。

最終的にLaravelらしい書き方を覚えればこれだけで済む。

php

1public function itemdata(Request $request) { 2 $items = Item::with(['categories', 'conditions'])->get(); 3 4 return view('detail', compact('items')); 5}

categories,conditionsが複数か単数か不明。リレーションの書き方も明らかに間違ってるけど元のコードが何も理解しないまま書かれてるので予想のしようがない。

投稿2024/04/22 01:42

pcs

総合スコア363

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問