Laravelを使ってみよう-11 データベースにアクセスしてみる

2022年11月25日

トップページを作ってみる

だいたいある程度初期データに書いてある内容がわかってきたような気がするので、トップページをなんとなく作っていこうと思います。

前回の記事で作った雑なページ構成に従い、トップページをhomeのbladeファイルに転送するようにして、ログインしている場合は日報の一覧、ログインしていない場合はログインもしくは新規ユーザー登録に誘導するような表示にします。

微妙にわかりづらい設計図

とりあえずweb.phpの内容でwelcomeページに飛ぶようになっているのをhome.phpに変更します。

トップページにアクセスするとこのようなページに飛びます。

現状ログインしていない状態なのにログイン中と表示される上にログインのメニューが表示されるという不思議な感じになるのでそれを修正します。

<div class="card-body">
	@if (session('status'))
		<div class="alert alert-success" role="alert">
			{{ session('status') }}
		</div>
	@endif
	{{ __('You are logged in!') }}
</div>

現在ログイン中と表示されている部分です。{{ __('You are logged in!') }}が裸で表示される状態になっているので、この部分をログインしている状態なら{{ __('You are logged in!') }}を表示、されていない状態なら(とりあえず)何も表示しないようにします。

app.blade.phpのファイルを参考に、

@guest

@else
	@if (session('status'))
		<div class="alert alert-success" role="alert">
			{{ session('status') }}
		</div>
	@endif

	{{ __('You are logged in!') }}
@endguest

@guest〜@elseの間にログインしていない場合の処理、@else〜@endguestの間にログインしてる場合の処理を表記します。すると、

ログインしていない時
ログインしている時

それっぽい感じになりました。ifなんたらかんたらとphpを書くより断然早くて便利ですね。

ついでにログインしていない場合はログイン画面に飛ばすようにリンクを表示するようにしときます。

[article_ad]

データベースの内容を表示する

ざっくり設計にしたがって、ログインしたトップ画面には日報の一覧とユーザーの一覧を表示したい。日報登録などまだ作ってないので取り急ぎユーザー一覧を表示させてみます。

こちらのページを見ながら順番にやってみます。まずはartisanでコントローラーを作成するとのことなのですが、homeのコントローラーはもうあるので作らなくてもいいかな?コントローラーの内容が若干違うのですが気にせずやってみましょう。

public function index()の内容に追記すればいけるでしょうか。追加したほうがいいんだろうか。

public function index()
{
	return view('home');
}

homeにアクセスしたらhomeのviewファイル(bladeファイル)を表示すると現状なっています。ここに、

public function index()
{
	return view('home');
	$members = DB::select('select * from members');
	$data = ['title' => 'メンバーリスト', 'members' => $members];
	return view('members.index', $data);
}

3行追加。sqlっぽいのを実行して$membersという変数に結果を配列で格納している?次の行で$dataとう変数にキー付きの配列を入れてますね。membersという配列に$membersの配列を格納してるけどどうなっちゃってるんだ…?

とここまでいろいろ書いてたんですが、

実行してみるとエラー吐きまくりだったのでいろいろ検証してました。最悪…。全然違ったので修正。

まず根本的にパラメーター無しのトップページにアクセスするとhomeのviewファイルを読み込むようにweb.phpに書いてました。

Route::get('/', function () {
    return view('home')->with('status', '例');
});

この部分。そうするとその下に書いていた、

Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');

この部分が死にます。HomeContorollerで書いた関数が永遠に使われないのでそもそもsql文書いても無駄にという事態でした。というかそもそもなんでこんな書き方してるんだろ??とりあえずこれを修正、そしてより簡潔に書き直しました。

Route::get('/', 'App\Http\Controllers\HomeController@index');

パラメーターなしの場合HomeControllerの関数を使用するというように変更しました。すると上で書いた関数を使用してくれました。

次にhomeのviewファイルに

<h1>{{ $title }}</h1>
 
<ul>
    @foreach ($members as $member)
    <li>{{ $member->name }}</li>
    @endforeach
</ul>

を追記すると、関数内で呼び出したユーザーデータと、冒頭にtitleというキーで指定した「メンバーリスト」という言葉を表示してくれるはずでした。エラーが多すぎてキャプチャーとってなかったのですが、まずデータベースを使用するヘルパーみたいなのがないとのエラーが出てデータベースにアクセスできませんでした。ログインできるのになんでやねんって話なのですが、これは参考にさせていただいているサイトの、

use Illuminate\Support\Facades\DB;

この部分をコピペすることで解決しました。ログイン関係のコントローラーのソース見てもないからなくてもデータベース接続はできそうなんだけど…

すると次は$titleがないとエラーが出ました。ここで関数が使われていないと思ってルーターの修正に至ったのですが、次は$membersがないとエラーが出ました。ここは全てコピペで終わらせようと横着したのが完全に失敗でした…

public function index()
{
	return view('home');
	$members = DB::select('select * from members');
	$data = ['title' => 'メンバーリスト', 'members' => $members];
	return view('members.index', $data);
}

先ほど書いたこれですが、そもそもreturn viewは結果を返す構文で、最後にreturn view('members.index', $data);があるので不要ですね。

次にsqlの部分なのですが、Laravelのユーザーテーブルはusersなのでmembersは間違いでした。

ここを直せば次の$dataの行は問題なし。

次のreturn view('members.index', $data);ですが、参考にしているサイトはmembersのviewファイルを作っているのでmembersとなっていますが、今回はhomeのviewファイルに結果を出力するのでhomeに変更します。indexって必要なのか…?

直した関数はこちら。

public function index()
{
	$members = DB::select('select * from users');
	$data = ['title' => 'メンバーリスト', 'members' => $members];
	return view('home', $data);
}

次にbladeファイルに

<h1>{{ $title }}</h1>
 
<ul>
    @foreach ($members as $member)
    <li>{{ $member->name }}</li>
    @endforeach
</ul>

先ほどもあったこれをペースト。場所はどこでもいいですが、@else〜@endguestの間に入れればログインした時だけ見えるようにできます。

すると、

ちゃんとできました…。ログアウトして別ユーザーとして登録してログインしてみると、

ちゃんと増えてました。ユーザー登録したときにRoute::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');をコメントアウトしていたためにpage not foundになってしまいました。もう一度表示にしたら上記画面になったので残しておくか、リダイレクト先を変えたほうがいいですね(探したけど見つからなかったです…)

さいごに

今回はデータベースに接続して内容を画面に出力するということをやってみました。

もっと練習が必要ですね。sqlも簡潔で配列を使えば出力もすごく簡単でした。次回は表の形での出力か、データベースへの登録画面の作成をやっていきたいと思います。

お知らせ

株式会社プラン・ドゥでは一番くじなどで馴染みのあるミシン目の入ったくじの販売を行なっております。



他社ではなかなかできない製品を最適な価格でご案内させていただいておりますのでぜひお問い合わせください。その他の取扱商品はこちらからご覧いただけます。
https://plando-inc.co.jp/product

同じカテゴリの記事

関連記事

スポンサーリンク

DTP

Laravel開発

wordpressカスタマイズ

デジタルマーケティング

ライフハック

動画

当社製品について

Contact各種お問い合わせ

お問い合わせ・ご相談など
まずはお気軽にご相談ください

お仕事のご依頼やご相談、弊社サービス内容に関してなど、お気軽にご相談ください。

トップページ コラム 各種お問い合わせ プライバシーポリシー