John
John

Reputation: 123

Laravel and relationships

I have created a few tables like so,

News (id, news_titles_id, create_time)

NewsTitles (id, name)

Now for my Models:

class News extends Eloquent {
    protected $table = 'News';

    public function title() {
        return $this->belongsTo('newsTitles', 'news_titles_id');
    }
}

class NewsTitles extends Eloquent {
    protected $table = 'NewsTitles';
}

Now if I try and use

$news = News::all();
echo $news->title->name;

I get the undefined property error on title.

What am I doing wrong here? Did I miss something in Laravels eloquent guide?

Upvotes: 0

Views: 37

Answers (2)

The Alpha
The Alpha

Reputation: 146191

You have tables as given below:

Table: NewsTitles: (id, name)

Table: News: (id, news_titles_id, create_time)

Models for that:

class NewsTitles extends Eloquent {

    protected $table = 'NewsTitles';

    public function news()
    {
        return $this->hasOne('News', 'news_title_id');
    }

}

class News extends Eloquent {

    protected $table = 'News';

    public function title()
    {
        return $this->belongsTo('NewsTitles', 'news_title_id');
    }

}

Use like:

$news = News::with('title')->all(); // returns a collection (more than one)
echo $news->first()->title->name; // Get first News
echo $news->get(0)->title->name; // Get first News
echo $news->get(1)->title->name; // Get second News

Or you may loop:

foreach($news as $item) {
    echo $item->title->name;
}

Upvotes: 1

Jake Wilson
Jake Wilson

Reputation: 91193

I think it needs to be

return $this->hasOne('NewsTitle', 'news_title_id');

since a News object "has one" news title.

And the inverse of the relationship, on the NewsTitle model would be

public function news()
{
  return $this->belongsTo('News', 'news_title_id');
}

Upvotes: 0

Related Questions