Laravel 4:渴望加载

Posted

技术标签:

【中文标题】Laravel 4:渴望加载【英文标题】:Laravel 4: Eager loading 【发布时间】:2013-11-20 23:06:47 【问题描述】:

我有一个名为 UserWords 的表,其中有一个 word_id 列,我想用它从 Words 表中获取行,然后像连接一样将它们连接在一起。这样每个人都将获得来自UserWordsWords 行的信息。我在UserWord 中定义了这样的关系:

class UserWord extends Eloquent
    public function word()
        $this->belongsTo('Word');
    


然后,我尝试像这样获取所有 UserWords 和 Words:

$words = UserWord::with("word")->
                whereRaw("user_id = ".Auth::user()->id.
                " AND lang1 = '".$lang1.
                "' AND lang2 = '".$lang2."'")
                ->get();

如果我没有 with() 的话,这可行。那么,我做错了什么?还是我必须创建一个原始的JOIN 才能得到我想要的?我以前从未做过关系,所以也许我在想这根本上是错误的?无论哪种方式,如果可以的话,请教我更多,而不仅仅是给出答案!我阅读了文档,我认为它应该可以工作,但事实并非如此......我在这里问。

编辑: 我得到的错误是:

Call to a member function addEagerConstraints() on a non-object 

【问题讨论】:

你得到什么错误? 已编辑以包含新信息。 【参考方案1】:

你的关系定义不正确,你必须返回belongsTo方法调用的结果。请尝试以下操作:

class UserWord extends Eloquent 
    public function word()
        return $this->belongsTo('Word');
    

【讨论】:

哇,我是个白痴。谢谢。 :P 也只是出于好奇,我用 with()->where()->get() 还是 where()->with()->get() 有关系吗? 这些链接方法调用的顺序不应该影响结果,然后在调用 get 方法之前,不会组装查询。【参考方案2】:
$words = UserWord::with('word')
    ->where('user_id', Auth::user()->id)
    ->where('lang1', $lang1)
    ->where('lang2', $lang2)
    ->get();

【讨论】:

所以如果我使用 with() 就不能使用 whereRaw 了吗? 我没有使用 where raw 但您的查询似乎不需要 raw。 我明白了,我试着改成你的样子,但还是不行。 “Word”模型是什么样的? @peaceman 刚刚帮了我,我就像个白痴一样忘了回来。

以上是关于Laravel 4:渴望加载的主要内容,如果未能解决你的问题,请参考以下文章

带有参数的渴望加载 - laravel

Laravel - 渴望加载多态关系的相关模型

Laravel Eloquent:渴望加载多个嵌套关系

Laravel 渴望加载数据透视表关系

采摘渴望加载Laravel 5.2

Laravel - 渴望加载多对多,仅获取一条记录(不是集合)