如何传递到路径的最后一个参数

时间:2017-08-26 14:39:05

标签: php laravel

我有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}?

1 个答案:

答案 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'));