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

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

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

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

Q&A

1回答

363閲覧

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

higulasi

総合スコア10

Laravel

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

0グッド

0クリップ

投稿2023/12/08 08:37

実現したいこと

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');

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

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

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

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

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

guest

回答1

0

eloquentのクエリビルダを使わずに自分で
resources/views/queries/Artical/配下にテンプレートファイルを作成し
以下の要領で呼び出せば良いです。
$id=[ID];
$articles = (new Article())->findBy名前;

余計なアドバイスかもしれませんが呼び出し後の扱いを楽にするために
ArticleモデルのCollectionとして返すようするべきです。

投稿2023/12/09 09:26

編集2023/12/09 21:08
mamekinkanmame

総合スコア39

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

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

higulasi

2023/12/11 01:18

回答ありがとうございます。 DB::rawの内容をViewで表示するにはどうしたらいいのでしょうか? もっと根本を言うと、テーブル結合をした際に特定のカラムをカウントし、それをviewに表示したいのですが、どのように記述したらいいのでしょうか?
mamekinkanmame

2023/12/12 02:04

PlayersController.php内の 「$player = Player::find($id);」の行にて 表示に必要なものを全て持ってくるようにするのが大前提とした場合 「Player.php」内にある「getPlayerData」というメソッドを 自作したテンプレートファイル内のメソッドと入れ替えるのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問