実現したいこと
laravelのMVCモデルを使用して、
データベースから情報一覧を表示し、
詳細ページへidを渡して遷移させたい。
前提
laravelの初学者です。
現在html,css,javascript,php,mysqlを学び
簡易的な自作アプリを作成してみています。
データベース情報から物件情報を一覧で表示して、
詳細ボタンを押して、
詳細ページへ画面遷移しようと思っているのですが、
上手くいかず悩んでおります。
お詳しい方、助言をいただけますと幸いです。
発生している問題・エラーメッセージ
エラーメッセージ: count(): Argument #1 ($value) must be of type Countable|array, string given
該当のソースコード
HouseController.php
use Illuminate\Http\Request; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\DB; // use AuthorizesRequests, ValidatesRequests; class HouseController extends Controller { // 物件一覧表のデータ取得 public function listOfHouse(Request $request) { $sort = $request->sort; $order = $request->order; //housesテーブルのhouse_idと一致するimagesテーブルを取得します。 $houses = DB::table('houses') // 主となるテーブル名 ->join('images', 'houses.img_id', '=', 'images.id') ->get(); return view('list-of-house', ['houses' => $houses,]); } // 物件の詳細ページを表示 public function showDetailHouse(Request $request) { $id = $request->id; $houses = House::find($id); return view('house-detail',['houses' => $houses,]); } }
list-of-house
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" type="text/css" href="{{ asset('css/index.css') }}"> <meta name="viewport" content="width=device-width,initial-scale=1"> </head> @extends('layouts.app') @section('content') <div class="body"> <p>空家物件一覧</p> <div class="list-of-house"> @foreach ($houses as $house) <table class="house-list"> <thead class="top-img"> <th></th> <tr> <td class="table-text1"><!-- トップ画像 --> <div><img class="top-house" src="{{ asset('storage/image/'.$house->top_img) }}"></div> </td> </tr> </thead> <tbody> <tr> <td >アクセス</td> <td class="table-text2"><!-- アクセス --> <div>{{ $house->access }}</div> </td> </tr> <tr> <td>住所</td> <td class="table-text6"><!-- 住所 --> <div>{{ $house->address }}</div> </td> </tr> <tr> <td>間取り</td> <td class="table-text3"><!-- 間取り --> <div>{{ $house->floor }}</div> </td> </tr> <tr> <td>建物面積</td> <td class="table-text4"><!-- 建物面積 --> <div>{{ $house->bulding_area }}㎡</div> </td> </tr> <tr> <td>築年数</td> <td class="table-text5"><!-- 築年数 --> <div>{{ $house->bulding_date }}年</div> </td> </tr> </tbody> </table> <a class="detail-button" href="/house-detail/?id={{ $house->id }}">詳細を見る</a> @endforeach
web.php
<?php use Illuminate\Support\Facades\Route; //ログイン機能追加のため use Illuminate\Support\Facades\Auth; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider and all of them will | be assigned to the "web" middleware group. Make something great! | */ Route::get('/', function () { return view('welcome'); }); Auth::routes(); Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); // 新規登録完了画面に遷移する Route::get('/register-complete', [App\Http\Controllers\Auth\RegisterController::class, 'RegisterRedirectPath'])->name('register-complete'); // 物件一覧に移動する Route::get('/list-of-house', [App\Http\Controllers\HouseController::class, 'listOfHouse'])->name('list-of-house'); //idを渡してhouse-detailページへ Route::get('/house-detail/{id?}',[App\Http\Controllers\HouseController::class,'showDetailHouse'])->name('house-detail');
試したこと
$houses = House::find($id);
コントローラーのfindの中を実際に得たい’1’を直接入れたり、
$request->idを直接代入してみたりしましたが、
エラーは解消されませんでした。
エラーの内容に関してcount関数の引数が文字列やarray型にしてほしいというような
ものだと認識しているのですが、
count関数を使用していないのになぜこのようなエラーが出てしまうのか
理解ができていません。
どなたかご教授の程、よろしくお願いいたします。
※追加で試したこと
下記に変更後もエラーは解消されませんでした。
list-of-house.php
<a class="detail-button" href="{{ route('house-detail', ['id'=>$house->id]) }}">詳細を見る</a>
ルート
Route::get('/house-detail/{id}', [App\Http\Controllers\HouseController::class, 'showDetailHouse'])->name('house-detail');
コントローラー
public function showDetailHouse(Request $request, $id) {
$houses = House::findOrFail($id);
return view('house-detail')->with('houses',$houses);
}
補足情報(FW/ツールのバージョンなど)
phpMyAdmin
Php Version
8.2.0
Laravel Version
10.11.0
回答1件
あなたの回答
tips
プレビュー