Неправильно работает роут, eloquent?

309
27 августа 2017, 05:30

Есть 3 роута:

1) /catalog/authors и метод контроллера который просто выводит список всех авторов из бд

2)/catalog/authors/{author} метод контроллера который выводит имя автора если я передаю его айди соответственно.

С этими 2мя я справился, но вот с 3им

3)/catalog/authors/{author}/{book} не получается Суть в том что я хочу вывести первую книгу заданного автора (одну книгу заданного автора )

Отношения между моделями соответственно:

Автор-Книга 1:М

методы books() и author() соответсвенно.

Маршрут вида /catalog/authors/1/1 Работает, НО на /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)
    {
        return view('author.books', compact('book', 'author'));
    }
}

Проблемный вью:

@foreach($author->books as $book)
    {{$book->title}}
    @endforeach

Модель Автор

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');
    }
}
Answer 1

Попробуйте сделать следующие изменения:

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

public function display(Author $author, Book $book)
{
    if (empty($book)) {
         return 'Такой книги нет';
    }
    return view('author.books', compact('book', 'author'));
}

В вью:

{{$book->title}}

В последний параметр роута /catalog/authors/{author}/{book} нужно передавать именно id книги (а не номер по порядку). Его можно получить так:

$bookId = $author->books()->first()->id; 
READ ALSO
Подключение эквайринг банка тинькофф v2

Подключение эквайринг банка тинькофф v2

Ребят всем привет, столкнулся с проблемой подключения эквайринга от тиньков банка, а именно 2 версии, в документации у них висит 1 версия через...

433
Как реализовать отправку таблицы на php? Работа с тегами

Как реализовать отправку таблицы на php? Работа с тегами

Возможно ли в PHP работать с тегом <tabel> также как и с тегом <form>? То есть делать формы регистрации, менять значения в БД и тд

266
Хитрый SQL запрос

Хитрый SQL запрос

Есть две таблицы users и ticketВ users хранится информация о пользователях

252