hi_lili
@hi_lili

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

laravelでテーブル結合し、詳細画面で表示させたい。

Q&A

Closed

解決したいこと

詳細画面(show.blade.php)で、companiesテーブルにあるcompany_nameを表示させたい。

productsテーブル
companiesテーブル

OS:Mac
laravel9
MySQL

・ネットで検索を行い、試してみましたが解決ができませんでした.
何卒ご教授いただけると幸いです。

show.blade.php

@extends('layouts.app')

@section('content')
@section('content')
   @if ($item != null) 
   <table>
      <tr>
         <th>id</th>
         <th>画像</th>
         <th>商品名</th>
         <th>値段</th>
         <th>メーカー</th>
         <th>在庫</th>
         <th></th>
      </tr>     
      <tr>
         <td>{{$item->id}}</td>
         <td>{{$item->image}}</td>
         <td>{{$item->name}}</td>
         <td>{{$item->price}}</td>
         <td>{{$item->company_name}}</td>
         <td>{{$item->stock}}</td>
         <td>{{$item->comment}}</td>
         <td>
            <form action="edit/{{$item->id}}" method='GET'>
               <input type="submit" value="編集">
            </form>
         </td>
      </tr>
   </table>
       <div class='return'>
      <a href="{{route('index')}}">戻る</a>
   </div>
   @endif
@endsection
@endsection

@section('footer')
@endsection

KadaiController


namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Product;
use App\Models\Company;

class KadaiController extends Controller
{
    //一覧表示
    public function index(Request $request)
    {
       $keyword = $request->input('keyword');
       $company = $request->input('company_id');

       $query = Company::query();
       $query->join('products', function ($query) use ($request){
        $query->on('products.company_id', '=', 'companies.id');
       });

       if(!empty($keyword))
       {
           $query->where('name', 'LIKE', "%{$keyword}%");
       }

       if(!empty($company))
       {
           $query->where('company_name', 'LIKE', $company);
       }

      
       $items = $query->orderBy('products.id', 'desc')->paginate(5);
       $company_list = Company::all();
       $hash = array(
        'keyword' => $keyword,
        'company' => $company,
        'items' => $items,
        'company_list' => $company_list,
       );
       return view('kadai.index')->with($hash);
   }

    //詳細画面
    public function show(Request $request)
    {
       $item = Product::find($request->id);
       return view('kadai/show', compact('item'));
     }
}


Product.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;

class Product extends Model
{
    use HasFactory;

    public $timestamps = false;

    protected $fillable = 
    [   
        'id',
        'image',
        'name',
        'price',
        'company_id',
        'stock',
        'comment',
    ];


    public function companies(){
        return $this->belongsTo('App\Models\Company');
    }
}

Company.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Company extends Model
{
    use HasFactory;

    public $timestamps = false;

    // protected $table = 'companies';

    protected $fillable = 
    [
        'company_name',
        'id',
    ];
    
    public function products(){
        return $this->HasMany('App\Models\Product');
    }

}
0

1Answer

Modelを見ると「1つのCompanyに複数のProductが属する」という構造に見えるので、1対多のリレーションにしたいのかなと思いました。
詳細画面の処理を見るとProductの詳細画面のようなので、ドキュメントの「1対多(逆)/所属」のケースだと思います。
「1件のCommentからPostのtitleを取得する」という例がそのまま置き換えられると思いますが、こちらは試してみましたか?

3Like

Comments

  1. @hi_lili

    Questioner

    @blue32a
    ご回答いただきありがとうございます。
    まだ試しておりませんでした・・・。
    ご教授の内容を試し、再度結果をお伝えできればとおもいます!

  2. @hi_lili

    Questioner

    @blue32a
    ご教授いただききました内容で修正しました。

    public function show(Request $request)
       {
           $item = Product::find($request->id);
           return $item->companies->company_name;
           return view('kadai/show', compact('item'));
       }
    

    そうすると、company_nameは返ってくるようになりましたが、
    その他productsテーブルのカラムが返ってこずです・・・。
    $request->idで取得していることが原因なのでしょうか?

  3. 関数やメソッドが返すことができる値は1つだけなので、残念ながらreturnを複数書いても意図したとおりにはなりません。
    マニュアルには次のようにあります。

    関数内で呼び出されると、return文は即座に その関数の実行を停止し、引数を関数の値として返します。

    よってreturn view('kadai/show', compact('item'));の行は実行されませんので、想定外の結果になると思いますよ。

    「例がそのまま置き換えられる」と言う表現をしたのは、あくまで「子から親のデータを参照する」というひとつの例における話ですので、実践では応用が必要になります。

  4. @hi_lili

    Questioner

    @bule32a
    ありがとうございます!
    bladeをご教授いただいた内容での修正をいたしましたら、しっかりと反映することができました!

    ご回答いただき、本当にありがとうございました。:bow:

  5. 横から失礼します。解決したのであれば、クローズにするといいですよ。

  6. @hi_lili

    Questioner

    @jinbei230525
    かしこまりました!
    クローズにいたしました、ありがとうございます!

Your answer might help someone💌