много ко многим ошибка при получении книги и имени автора laravel - PullRequest
0 голосов
/ 23 февраля 2020

Невозможно отобразить все книги и имя автора в виде списка. Получаю ошибку. Если я возвращаю переменные books и авторы в контроллер (метод индекса), я получаю данные в виде массива. Но не может получить к ним доступ в поле зрения. Также, как упомянуто в комментируемом коде (в Book Controller) ниже, код из laravel документации показывает ошибку.

Модель книги

class Book extends Model
{
 protected $guarded = [];

 public function authors(){
    return $this->belongsToMany('App\Models\Author')->withTimestamps();
 }
}

Модель автора

class Author extends Model
{
 public $guarded = [];

 public function books(){
    return $this->belongsToMany('App\Models\Book')->withTimestamps();
 }
}

Книжный контроллер

 public function index()
{
    $query = Book::with('authors')->get();
    Pls Read the commented lines below -
    //foreach ($query as $book) {
    //return $book->authors->author_name;  //Error: Property [author_name] does not exist on this collection instance.
    //}
    // (above code is given in laravel documentation but shows error : why?) 
    foreach($query as $b){
     $books[] = $b->book_name; 
     $authors[] = $b->authors->first()->author_name; 
    }
    return view('books.index', compact('books','authors'));
}

public function create()
{
    return view('books.create');
}

public function store(validateAuthorBook $request)
{
    $validated = $request->validated();
    if($validated){
        $book = new Book();
        $book->book_name = $request->book_name;
        $book->save();

        $author = new Author();
        $author->author_name = $request->author_name;
        $author->save();

        $book->authors()->attach($author);
    }

    return back()->with('status', 'Insert Successful!');
}

Просмотр (index.blade. php)

  @foreach($books as $b)
    <tr>
        <th>{{$loop->iteration}}</th>
        <td>{{$b->book_name}}</td>
        //<td>how to get author name</td>
        @endforeach
    </tr>

ошибка

Facade\Ignition\Exceptions\ViewException
Trying to get property 'book_name' of non-object (View: 
D:\ProgrammingSSD\laragon\www\ulclibrary\resources\views\books\index.blade.php)

1 Ответ

0 голосов
/ 23 февраля 2020

Вы получаете ошибку, потому что вы делаете $book строку в массиве ($books[] = $b->book_name;). Вы не должны ничего делать с коллекцией $books в контроллере и можете отправить ее непосредственно для просмотра.

Контроллер:

public function index()
{
    $books = Book::with('authors')->get();
    return view('books.index', compact('books'));
}

Просмотр ( одна строка, разделить авторов запятой):

@foreach($books as $book)
    <tr>
        <td>{{ $loop->iteration }}</td>
        <td>{{ $book->book_name }}</td>
        <td>{{ $book->authors->pluck('author_name')->implode(', ') }}</td>
    </tr>
@endforeach

Вид (l oop, разделить авторов новой строкой):

@foreach($books as $book)
    <tr>
        <td>{{ $loop->iteration }}</td>
        <td>{{ $book->book_name }}</td>
        <td>
            @foreach($book->authors as $author)
                {{ $author->author_name }}<br/>
            @endforeach
        </td>
    </tr>
@endforeach
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...