Передайте две переменные методу в Laravel

Я хочу найти сообщение по slug также в url .. но комментарии должны быть найдены post_id

Контроллер

public function post($slug,$id)
{
    $post = Post::where('slug',$slug)->first();
    $comments = Comment::where('post_id',$id)->get();
    return view('content.post',compact('post','comments'));
}

Маршрут

Route::get('post/{slug}', 'PagesController@post')->name('post.show');

5 ответов

Решение
Route::get('post/{slug}', 'PagesController@post')->name('post.show');
public function post($slug)
{
    $post = Post::where('slug',$slug)->first();
    $comments = Comment::where('post_id',$post->id)->get();
    return view('content.post',compact('post','comments'));
}

Ну вот:

Получить post_id от $post сам.

public function post($slug){
    $post = Post::where('slug',$slug)->first();
    $comments = Comment::where('post_id',$post->id)->get();
    ...
}

ПОПРОБУЙ ЭТО

public function post($slug)
{
    $post = Post::where('slug',$slug)->first();
    $comments = Comment::where('post_id',$post->id)->get();
    return view('content.post',compact('post','comments'));
}

В web.php:

Route::get('post/{slug}', 'PagesController@post')->name('post.show');

в контроллере:

public function post($slug)
{
    $post = Post::where('slug',$slug)->first();
    $comments = Comment::where('post_id',$post->id)->get(); //use founded_post_id to find it's comments
    return view('content.post',compact('post','comments'));
}

Вы можете использовать привязку модели маршрута, чтобы гарантировать, что маршруты найдут вашу модель на основе предоставленного ключа.

Твой Post модель потребует, чтобы вы добавили следующий метод:

public function getRouteKeyName()
{
    return 'slug';
}

Затем в своих маршрутах вы можете просто ссылаться на модель напрямую, и привязка произойдет автоматически:

public function post(App\Post $post)
{
    $comments = Comment::where('post_id',$post->id)->get();
    return view('content.post',compact('post','comments'));
}

Это позволяет вам использовать следующий маршрут:

Route::get('post/{post}', 'PagesController@post')->name('post.show');

Теперь, кроме того, чтобы упростить упоминание комментариев, добавьте их как отношения к вашему Post модель:

public function comments() 
{
    return $this->hasMany(Comment::class);
}

и ваш Comment модель:

public function post()
{
    return $this->belongsTo(Post::class);
}

Это позволит вам еще больше сократить метод контроллера:

public function post(App\Post $post)
{
    return view('content.post',compact('post'));
}

и вместо этого в вашем представлении Blade сделайте следующее:

@foreach($post->comments as $comment)
From: {{ $comment->name }} blah blha
@endforeach
Другие вопросы по тегам