سؤال

I have a list of books and a list of authors. I made the Model relations, so that my Book Model says, that books->belongTo('Author') and my Author Model says, that authors->hasMany('Book').

So normally I could access the a variable through this: $books = Book::all();

And then in the view:

@foreach($books as $book)           
        <div>{{$book->id}}</div>
        <div>{{$book->title}}</div>
        <div>{{$book->authors->firstname}}</div>            
@endforeach

But this does not work. I get the error message: Trying to get property of non-object

So here are my files:

My Models:

Book.php

 class Book extends \Eloquent {
protected $guarded = [];

public function religions()
{
    return $this->belongsTo('Religion');
}

public function branches()
{
    return $this->belongsTo('Branch');
}

public function authors()
{
    return $this->belongsTo('Author');
}

public function quotes()
{
    return $this->hasMany('Quote');
}

public function chapters()
{
    return $this->hasMany('Chapter');
}
 }

Author.php

class Author extends \Eloquent {
    protected $guarded = [];

    public function books()
    {
        return $this->hasMany('Book');
    }

    public function quotes()
    {
        return $this->hasMany('Quote');
    }

    public function branches()
    {
        return $this->belongsTo('Branch');
    }

    public function religions()
    {
        return $this->belongsTo('Religion');
    }
}

Then come my controller:

ReligionBranchBookController

class ReligionBranchBookController extends \BaseController {

    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index($religionId, $branchId)
    {
        //
        // $books = Book::where('religion_id', $religionId)->where('branch_id', $branchId)->get();
        $books = Book::all();
        $authors = Author::all();
        // dd($books->toArray());

        return View::make('books.index')
            ->with('religionId', $religionId)
            ->with('branchId', $branchId)
            ->with('books', $books)
            ->with('authors', $authors);
    }

}

My Views:

index.blade.php

 @extends('layout.main')

@section('content')

    <h1>Books List!!</h1>

    <table>
        <tr>
            <th>ID</th>
            <th>Title</th>
            <th>Author</th>
        </tr>

        @foreach($books as $book)
            <tr>
                <td>{{$book->id}}</td>
                <td>{{$book->title}}</td>
                <td>{{$book->authors->firstname}}</td>
            </tr>
        @endforeach
    </table>

@stop

I know that it should normally work, I rebuild it with only books and authors, and it works fine there.

So, does anyone have an idea, where I am going wrong?

Thanks,

George

هل كانت مفيدة؟

المحلول

In your Book model change the authors method to author like this:

public function author()
{
    return $this->belongsTo('Author');
}

Because, one book belongs to one author according to your relationship and when you call authors the belongsTo->getResults() get called and runs the wrong query so authors get null and you get the error. Things to remember:

  • For hasOne and belongsTo relationship use singular form of relationship method, i.e, author not authors.
  • hasOne or belongsTo returns a single model object.

  • For hasMany and belongsToMany relationship use plural form of relationship method, i.e, authors not author.

  • hasMany and belongsToMany returns a collection of model objects.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top