Laravel动态属性无法正常工作

6

我正在使用Laravel中的Eloquent ORM,并使用hasMany关系。

当我运行以下代码时:

Level::find(1)->lessons()->get();

它可以正常工作,但是当我使用以下动态属性时出现问题:
Level::find(1)->lessons

它只返回level的结果,而不是lessons的结果。

我需要在其他地方进行设置吗?

修改:这里是模型:

class Level extends Eloquent {

    protected $table = 'levels';

    public function lessons()
    {
        return $this->hasMany('Lesson');
    }
}

class Lesson extends Eloquent {

    protected $table = 'lessons';

    public function level()
    {
        return $this->belongsTo('Level');
    }
}

添加了模型,没什么特别的,只是按照文档进行操作,不确定是否还有其他参数或设置需要调整才能使其正常工作。 - Rob
这很奇怪,一切都是正确的。 - wesside
是的,我在这里真的没有做任何特别的事情,get() 调用也很正常。它没有返回任何错误,什么都没有,只是不运行。如果我回显最后一个查询,它会显示获取 level 而不是该级别的 lessons 的查询。 - Rob
这可能会有所帮助:http://stackoverflow.com/questions/18913560/laravel-4-how-to-access-reverse-one-to-many-relation/19015323#19015323。 - The Alpha
2个回答

9

我遇到了同样的问题,原来是表中有一列与我设置的关联名称相同。

确保模型中没有一个列与您尝试加载的关系方法同名。

编辑:我还注意到laravel在关系名称中有下划线(_)问题,所以不要在方法名称中加入下划线,否则它将无法工作。


1
应该标记为正确。经过测试,至少在Laravel 4中是正确的。 - Dragos Bobolea
1
这在5.2中仍然适用;列名将覆盖动态属性。 - miken32
我也遇到了同样的问题。在我的情况下,“author”没有起作用。当我将其更改为“creator”时,关系就起作用了。 - Mohammad Hossein

3

你需要急切地加载关系。

Level::with('lessons')->find(1)->lessons; 应该可以工作。

如果你想每次加载这个关系,你应该在 Level 模型中添加这一行。

protected $with = array('lessons');


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接