Laravelにおける、DB結合とViewへの表示

実現したいこと

Laravelで、データベースを結合してgoals.idのカウント数を表示したいです。

前提

私は今、選手がどの試合に出て、その試合の中でゴールを決めたのか、またそれは何分の出来事なのかを表示するものを作成しています。

下記のようにモデルとコントローラーを記述したのですが、DB::raw('COUNT(goals.id) as 得点数'),や、 DB::raw('GROUP_CONCAT(enemy_country.name) as 相手国名'),を、View(detail.blade.php)へ表示する記述の仕方がどうしてもわかりませんでした。

初歩的な問題で申し訳ないのですが、教えていただけませんでしょうか?

Player.php(Model)

<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\DB; class Player extends Model { use HasFactory; public function allplayer(){ $players = player::where('del_flg', 0)->paginate(20); return $players; } //players.country_idとcountries.idを結合 public function country() { return $this->belongsTo(Country::class, 'country_id', 'id'); } //palayers.idとgoals.player_idを結合 public function goals() { return $this->hasMany(Goals::class, 'player_id', 'id'); } //pairings.player_idとplayers.id、goals.pairing_idとpairings.idを結合 public function pairings() { return $this->hasManyThrough(Pairing::class,Goals::class,'player_id', 'pairing_id', 'id', 'id'); } public function enemyCountry() { return $this->hasManyThrough(Country::class,Pairing::class,'player_id','id','enemy_country_id', 'country_id'); } public function getPlayerData() { return $this->with(['country', 'goals', 'pairings', 'enemyCountry']) ->select( 'players.id as id', 'players.uniform_num as 背番号', 'players.position as ポジション', 'players.name as 名前', 'countries.name as 国名', 'players.club as 所属', 'players.birth as 誕生日', 'players.height as 身長', 'players.weight as 体重', DB::raw('COUNT(goals.id) as 得点数'), DB::raw('GROUP_CONCAT(enemy_country.name) as 相手国名'), DB::raw('GROUP_CONCAT(pairings.kickoff) as 試合開始時刻'), DB::raw('GROUP_CONCAT(goals.goal_time) as ゴールタイム') ) ->join('countries', 'players.country_id', '=', 'countries.id') ->leftjoin('goals', 'players.id', '=', 'goals.player_id') ->join('pairings', 'goals.pairing_id', '=', 'pairings.id') ->join('countries as enemy_country', 'pairings.enemy_country_id', '=', 'enemy_country.id') ->groupBy( 'players.id', 'players.uniform_num', 'players.position', 'players.name', 'players.club', 'countries.name' ); } }

各データベースごとのモデル(countriesテーブル、goalsテーブル、pairingsテーブル)

<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Country extends Model { use HasFactory; } <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Goals extends Model { use HasFactory; } <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Pairing extends Model { use HasFactory; }

PlayersController.php(Controller)

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use App\Models\Player; class PlayersController extends Controller { public function index(){ $playerTable = new Player; $players = $playerTable->allPlayer(); return view('players.index', ['players' => $players]); } public function detail($id) { // $idに対応する選手をデータベースから取得する例 $player = Player::find($id); // 取得した選手の情報をビューに渡して選手の詳細ページを表示する return view('players.detail', [ 'player' => $player, ]); } }

detail.blade.php(View)

<!-- resources/views/players/show.blade.php --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="{{ asset('css/players.css') }}"> <title>選手の詳細事項</title> </head> <body> <h1>選手データ</h1> <table class='players_data'> <tr><th>No</th><td>{{ $player->id }}</td></tr> <tr><th>背番号</th><td>{{ $player->uniform_num }}</td></tr> <tr><th>ポジション</th><td>{{ $player->position }}</td></tr> <tr><th>名前</th><td>{{ $player->name }}</td></tr> <tr><th>国</th><td>{{ $player->country->name}}</td></tr> <tr><th>誕生日</th><td>{{ $player->birth }}</td></tr> <tr><th>身長</th><td>{{ $player->height }}</td></tr> <tr><th>体重</th><td>{{ $player->weight }}</td></tr> <tr><th>総得点</th><td></td></tr> <tr><th>得点履歴</th><td></td></tr> </table> <!-- 戻るボタン --> <a class='redirectbutton' href="{{ route('players.index') }}">戻る</a> </body> </html>

web.php(Route)

<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\PlayersController; //Route::HTTPメソッド(getなら、ページの表示)('URL'(/~~/{**}は、~~が固定のパス、**は「動的に変わるプレイヤーの識別子やIDを示す)),[クラス名::class, 'メソッド名'(Controller.phpに記載している、function ~~()のこと)]) -> name('このルート自体の名前を設定'); Route::get('/', [PlayersController::class, 'index'])->name('players.index'); Route::get('/players/{player}', [PlayersController::class, 'detail'])->name('player.detail'); Route::get('/players/{player}/update', [PlayersController::class, 'update'])->name('player.update'); Route::get('/players/{player}/delete', [PlayersController::class, 'delete'])->name('player.delete');

コメントを投稿

0 コメント