Laravel 4无法使用查询构建器从belongsTo关系中检索值

时间:2014-06-16 15:58:57

标签: laravel-4 query-builder

我有两个表,organizationscategories。这就是我的表格和模型的设置方式:

表:

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

categories
id - integer
name - string

型号:

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');
    }
}

在我的routes.php文件中,我有以下代码(其中$category等于“组织”):

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

在我看来,我能够毫无错误地执行以下操作:

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

但是,调用$tile->category->name会给我一个错误Trying to get property of non-object。调用$tile->category只会返回null。如何显示与组织关联的类别?我能够很好地检索其他属性和关系,但这给了我一个问题。

1 个答案:

答案 0 :(得分:2)

您的代码中存在错误:$category . '.id'应该$category . '.category_id'这样做会使$tile->category->name工作。

另请注意(您可能已经知道此),在您提供的代码中,您实际上并未使用Organization类中设置的belongsTo关系,您只是在使用联合数据。

以下也可以使用Eloquent ORM利用模型关系方法:

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

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

或者你可以从类别模型中反过来这样做:

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

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