chipit24
chipit24

Reputation: 6987

Laravel 4 unable to retrieve value from belongsTo relation using query builder

I have two tables, organizations and categories. This is how my tables and models are set up:

Tables:

organizations
id - integer
category_id - integer, fk
name - string
...

categories
id - integer
name - string

Models:

class Organization extends Eloquent
{
    public function category()
    {
        return $this->belongsTo('Category');
    }
    public function comments()
    {
        return $this->morphMany('Comment', 'commentable');
    }
}

class Category extends Eloquent
{
    public $timestamps = false;

    public function organization()
    {
        return $this->hasMany('Organization');
    }
}

In my routes.php file, I have the following code (where $category is equal to "organizations"):

$query = Organization::query()
    ->join('categories', 'categories.id', '=', $category . '.id')
    ->select('categories.name as category');
$tiles = $query->get();

In my view, I am able to perform the following actions without any errors:

foreach($tile->comments as $comment)
{
    ...
}
...
$tile->name;

However, calling $tile->category->name will give me the error Trying to get property of non-object. And calling $tile->category will just return null. How can I display the category associated with the organization? I am able to retrieve other properties and relations just fine, but this is giving me a problem.

Upvotes: 1

Views: 917

Answers (1)

carbontwelve
carbontwelve

Reputation: 1100

You have a bug in your code: $category . '.id' should be $category . '.category_id' doing so should make $tile->category->name work.

Also please note (you probably already know this) that in the code that you provided you are not actually using the belongsTo relation as set in your Organization class, you are just using the joined data.

The following would also work using the Eloquent ORM utilizing the models relationship methods:

$tiles = Organization::with('category')
->get();

foreach ($tiles as $tile)
{
    echo $tile->name . '<br>';
    echo $tile->category->name . '<br>';
}

Or you could do so the other way round from the categories model like so:

$tiles = Category::with('organization')
    ->get();

foreach ($tiles as $tile)
{
    echo $tile->name . '<br>';
    foreach($tile->organization as $org)
    {
        echo $org->name . '<br>';
    }
}

Upvotes: 2

Related Questions