Laravel Relationships
Asked Answered
M

2

14

I've been looking over relationships in Laravel 4 in the documentation and I'm trying to work out the following.

I have a table in my database called 'events'. This table has various fields that mainly contain ID's that relate to other tables. For example, I have a 'courses' table. The events table contains a field called 'course_id' which relates to the ID of the 'id' field in the courses table.

So basically, I'm after some advice on how you go about relating the two (belongsTo()?) and then passing the connected data to the view.

Here is where I am at so far http://paste.laravel.com/pf3.

I hope you guys are able to give me some advice on how best to approach this problem. Thanks.

Gaz

Melisenda answered 25/4, 2013 at 9:4 Comment(0)
S
17

This is basically the same answer as @Marko Aleksić, but with the hasOne() and belongsTo() relationships the right way around.

class Course extends Eloquent{

    protected $table = 'courses';


    public function event()
    {
        return $this->hasOne('Event'); // links this->id to events.course_id
    }
}


class Event extends Eloquent {

    protected $table = 'events';

    public function course()
    {
        return $this->belongsTo('Course'); // links this->course_id to courses.id
    }

}
Silken answered 2/3, 2015 at 10:48 Comment(0)
C
8

You need to specify in both models a relationship. belongsTo() in one, hasOne() in the other, since you are using one-to-one relationship

class Course extends Eloquent{

    protected $table = 'courses';


    public function event()
    {
        return $this->belongsTo('Event');
    }
}


class Event extends Eloquent {

    protected $table = 'events';

    public function course()
    {
        return $this->hasOne('Course');
    }

}

Then calling it in the route or the controller would be as following:

Course of specific event (in this case with id of 1)

$course = Event::find(1)->course;

Event of specific course (in this case with id of 1)

$event = Course::find(1)->event;

Please refer to the Laravel 4 documentation, section Eloquent ORM: http://laravel.com/docs/eloquent#one-to-one

Caralie answered 25/4, 2013 at 9:51 Comment(3)
Hi, no sorry. An event will only ever have 1 course associated with it.Melisenda
Then, instead of hasMany use belongsTo() with hasOne()Convolvulus
A hasOne() relationship matches 'this' model's 'id' to a 'foreignKey' in the related table. A belongsTo() relationship matches a related table's 'id' to a 'localKey' field on 'this' model. Another way to think about it is the belongsTo() relationship should live on the model that has the field that links to the related tables id. The hasOne() relationship should live on the model that is 'being linked to' by a field on a related table. ----- All that being said, the above answer seems to be the wrong way around given the OP said "events table contains a field called 'course_id'"Silken

© 2022 - 2024 — McMap. All rights reserved.