参考ページ
https://qiita.com/phper_sugiyama/items/bdeee931ae2b821af895
https://www.messiahworks.com/archives/24058
こちらの情報を元にshow
やedit
等、通常は主キー(id)を指定するルーティングを、代わりに主キーの持つレコード(文字列)を使用する方法を備忘録として残しておきます。
やりたい事
ブログページで別ページのリンクhttp://localhost:8000/sample
をつけたい。
urlをaタグに直接入れればもちろん解決できますが、ルーティングを使用して行いたい。
<a href="http://localhost:8000/sample">オススメ記事</a>
↓
<a href="{{ route('blog.show','sample')}}">オススメ記事</a>
開発環境
Windows 10
XAMMP
PHP 7.4.29
Laravel Framework 8.83.15
マイグレーション
ブログテーブルにタイトル、本文、urlの3つを定義します。urlは重複出来ないのでunique()
を付ける。
public function up()
{
Schema::create('blogs', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->string('title');
$table->string('contents');
$table->string('url')->unique();
});
}
モデル
ルーティングの際にid
の代わりにurl
を指定したいので、今回のポイントであるgetRouteKeyName
メソッドをモデル内で使用します。
class Blog extends Model
{
use HasFactory;
protected $fillable = [
'title',
'contents',
'url',
];
public function getRouteKeyName()
{
return 'url';
}
}
コントローラー
class BlogController extends Controller
{
public function index()
{
$blogs = Blog::all();
return view('blog.index', compact('blogs'));
}
public function show(Blog $blog)
{
return view('blog.show', compact('blog'));
}
}
ルーティング
Route::Resource('blog', BlogController::class);
ビュー
モデル内でgetRouteKeyName
メソッドを使用してurl
を定義したため$blog->url
で指定できる。
@foreach ($blogs as $blog)
<p><a href="{{ route('blog.show',$blog->url)}}">{{ $blog->title }}</a></p>
@endforeach
モデル内でgetRouteKeyName
メソッドを使用してurl
を定義したため
{{ route('blog.show','指定url')}}
で指定できる。
<p>{{ $blog->title }}</p>
<p>{{ $blog->contents }}</p>
<a href="{{ route('blog.show','sample')}}">オススメ記事</a>