如何传递给路由的最后一个参数
问题描述:
我有3条路由: 1)/ catalog/authors和控制器方法,它简单地显示数据库中所有作者的列表 2)/ catalog/authors/{author }控制器的一个方法,如果我将它传递给id,则分别输出作者的姓名。 With these 2 I coped,but with 3: 3)/ catalog/authors/{author}/{book}不起作用,问题是我想打印给定作者的第一本书给定的作者)的模型之间的关系 是:如何传递给路由的最后一个参数
作者图书1:M
方法书()分别作者()。
路径:/ catalog/authors/1/1 Works,BUT on/catalog/authors/1/2它产生完全相同的结果(书名例如,/ catalog/authors/1/1)。虽然作者的第二本书未在数据库中指定,但试图尽可能清楚地解释。
一般来说,我不明白数据库中是否存在任何查询。
路线:
Route::get('/catalog/authors', '[email protected]');
Route::get('/catalog/authors/{author}', '[email protected]');
Route::get('/catalog/authors/{author}/{book}', '[email protected]');
控制器:
class AuthorsController extends Controller
{
public function index()
{
$authors = Author::all();
return view('author.index', compact('authors'));
}
public function show(Author $author)
{
return view('author.show', compact('author'));
}
public function display(Author $author, Book $book)
{
if (empty($book)) {
return 'Book doesnt exist';
}
return view('author.books', compact('book', 'author'));
}
}
查看:
{{$book->title}}
型号:
class Author extends Model
{
public function books()
{
return $this->hasMany(Book::class);
}
}
class Book extends Model
{
public function author()
{
return $this->belongsTo(Author::class, 'author_id');
}
}
我知道我必须这样做: $ bookId = $ author-> books() - > first() - > id;
但是我不知道在哪里我必须添加此:在控制器?在路线? 我可以如何将它转移到{book}?
答
在您当前的方法display()
方法中,您正在检查是否存在编号为$book_id
的书。
相反,您应该检查作者是否有任何书籍$book_id
。
所以,你display()
方法shlould是,
//Check if author has the book with provided book id
$bookResult = $author->books()->where('book_id','=',$book->book_id)->first(); //assuming you have primary key as book_id
if (empty($bookResult)) {
return 'Book doesnt exist';
}
return view('author.books', compact('bookResult', 'author'));
什么呢'{{$书本 - >标题}}'在第二路径'/ 1/2'的情况下,乌尔图打印? – jaysingkar
你在这里接受教程吗?也许可以参考它的背景信息。我不清楚你如何不知道是否有数据库查询?你没有自己写这个代码? – Lewis42
@jaysingkar像1/1一样 –