我有3条路线: 1)/ catalog / authors和控制器方法,它只显示数据库中所有作者的列表 2)/ catalog / authors / {author}控制器的一种方法,如果我将它分别传递给id,则打印出作者的名字。 有了这2个我应对,但有3个: 3)/ catalog / authors / {author} / {book}不起作用,问题是我要打印给定作者的第一本书(给定作者的一本书) 模型之间的关系是:
作者 - 书1:M
分别使用books()和author()方法。
路线:/ catalog / authors / 1/1 Works,但/ catalog / authors / 1/2它产生完全相同的结果(例如书的标题,至/ catalog / authors / 1/1 )。虽然作者的第二本书没有在数据库中指定,但试图尽可能清楚地解释。
一般情况下,我不明白数据库中是否有任何查询是否有此检查。
路线:
Route::get('/catalog/authors', 'AuthorsController@index');
Route::get('/catalog/authors/{author}', 'AuthorsController@show');
Route::get('/catalog/authors/{author}/{book}', 'AuthorsController@display');
控制器:
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}?
答案 0 :(得分:0)
在您当前使用display()
方法的方法中,您正在检查标识为$book_id
的图书是否存在。
相反,您应该检查作者是否有任何$book_id
的书
所以,你的display()
方法应该是,
//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'));