前回かなり時間をかけて記事の作成をしたが、知識習得のためのアウトプットが優先されるのでもっとかいつまんで行く。
テーブル作成
スレッド用マイグレーション
ファイル:create_threads_table.php
public function up()
{
Schema::create('threads', function (Blueprint $table) {
$table->id(); // スレッドID
$table->string('title'); // スレッドタイトル
$table->timestamps(); // 作成日時・更新日時
});
}
これを入れ込んだ。
Schema::create
というメソッドでテーブル作成
('threads', function (Blueprint $table) {
(テーブル名,カラム作るぞ)
Blueprintクラスの設計図をつかって$tableを作ってくぞという認識。
こんな感じで投稿用のマイグレーションファイルにも追加していく。
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id(); // 投稿ID
$table->foreignId('thread_id')->constrained()->onDelete('cascade'); // スレッドID
$table->text('content'); // 投稿内容
$table->timestamps(); // 作成日時・更新日時
});
}
マイグレーションファイルができたらDBに反映させる。
php artisan migrate
mysql -u root
USE bulletin_board;
SHOW TABLES;
これで出力ができていれば完了
モデルとコントローラー作成
php artisan make:model Thread
php artisan make:model Post
こんなにもターミナルを使うと思ってなかった笑
もうVSコードとかGUIを駆使して全て賄えるものだと思っていた。。。。
Thread モデル
これを記述
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Thread extends Model
{
use HasFactory;
protected $fillable = ['title'];
public function posts()
{
return $this->hasMany(Post::class);
}
}
モデルはデータベーステーブルと連携するアーキテクチャ。
namespace App\Models;
わたしはここにいるよ!という居場所の指定。
クラス名の重複を防ぐんだとか。
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
ここの階層の機能使うよー
class Thread extends Model
Thread クラスがさっきインポートしたModelの機能を継承
public function posts()
{
return $this->hasMany(Post::class);
}
コントローラーからでもビューからでも呼び出しできるよ。
Postと一対多にするよ。
Postモデルも同じく記述していく。
コントローラーの作成
php artisan make:controller ThreadController --resource
php artisan make:controller PostController --resource
コントローラー作って
この中身も作成していく。
namespace App\Http\Controllers;
use App\Models\Thread;
use Illuminate\Http\Request;
class ThreadController extends Controller
{
// スレッド一覧を表示する
public function index()
{
$threads = Thread::all(); // データベースからすべてのスレッドを取得
return view('threads.index', compact('threads')); // ビューに渡す
}
}
use はこの機能をインポートするよ
そしてThreadControllerに継承すると言っている。
'threads.index'
は
resources/views/threads/index.blade.php
を指定。
compact('threads')
連想配列としてthreadsを生成する
ルーティングの設定
routes/web.phpに
use App\Http\Controllers\ThreadController;
Route::get('/', [ThreadController::class, 'index']); // トップページにスレッド一覧を表示
Route::resource('threads', ThreadController::class); // RESTfulなスレッドのルートを生成
アプリケーションのトップページ(/)にアクセスがあったときに ThreadController の index メソッドを呼び出し。
Route::resourceを使うとCRUDの機能を一括で定義できるらしい。
ビューの作成
resources/views/threads/
に
index.blade.php
を作成。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>スレッド一覧</title>
</head>
<body>
<h1>スレッド一覧</h1>
<ul>
@foreach ($threads as $thread)
<li>{{ $thread->title }}</li>
@endforeach
</ul>
</body>
</html>
これは簡単だった。
さっきあったコントローラーの値がここに飛んでくる仕様。
@foreach ($threads as $thread)
<li>{{ $thread->title }}</li>
@endforeach
($threads as $thread)
$threadsに来たものを一つずつ$threadにいれるよ。
$thread->title
これを表示。
それをforeachで繰り返すよ。
ということ。
これでとりあえずデータベースに保存されているtitleを呼び出すことができた。
/にアクセスするとルーティングがコントローラーを呼ぶ。
コントローラーがモデルで設定したルールを元に処理を開始。
それをビューで表示する。
ここまでは理解できたぞ。
実は今はもうすこし先を作業している。
作業中は理解が追いつかないけど振り返ると理解できてくる。
進めながら復習兼ねて書いていく!
頑張れ私