【问题标题】:How to pass to the last parameter of the route如何传递给路由的最后一个参数
【发布时间】:2018-02-04 09:34:09
【问题描述】:

我有 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 )。虽然作者的第2本书没有在数据库中指定,但尽量解释清楚。

总的来说,我不明白数据库中是否有任何查询用于此检查。

路线:

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/2,您的视图中的{{$book->title}} 会打印什么?
  • 你在看这里的教程吗?也许可以参考它的背景信息。我不清楚你怎么不知道是否有数据库查询?这段代码不是你自己写的?
  • @jaysingkar 和 1/1 一样

标签: php laravel


【解决方案1】:

在您当前的display() 方法中,您正在检查ID 为$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'));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 2018-06-20
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2016-07-01
    相关资源
    最近更新 更多