【问题标题】:Laravel / Eloquent eager loadingLaravel / Eloquent 急切加载
【发布时间】:2016-07-31 22:39:18
【问题描述】:

对于某些人来说,这将是一个简单的问题,但我似乎无法在网上或文档中找到答案(只有我不想要的变体)。

  • 假设我们有一个 Question
  • 每个Question 对象可以选择有多个Tags

我已经设置了类,并且一切都按预期进行。目前我使用:

  • $questions = Question::all();

这按预期工作,但它不会急切加载。

要明确:$question->tags 给出了我期望的数组。不存在关系问题。

由于新的要求,我将创建一个可能包含数千个问题的视图,因此这种急切加载是必须的。

我尝试使用:

  • $questions = Question::with('tag')->all();

给出错误信息:

Builder.php 第 2345 行中的 BadMethodCallException:调用未定义的方法 Illuminate\Database\Query\Builder::all()

每个教程,或者我在谷歌上急切加载的方式,要么指定一个 ID,要么是一个关于如何只显示有孩子的父母的教程。

我只是想要“所有人和他们的孩子”。

这一定很简单..有人知道怎么做吗?

谢谢 瑞克

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    您应该在模型中定义方法。据我所知,您将建立一对多的关系。这将是

    class Question extends Model
    {
        public function tags()
        {
            return $this->hasMany('App\Tag');
        }
    }
    

    标签类

    class Tag extends Model
    {
        public function question()
        {
            return $this->belongsTo('App\Question');
        }
    }
    

    还有控制器。而不是all() 使用get() 方法。

    $questions = Question::with('tags')->get();
    

    正如我在 Question 模型中定义的 tags 方法。 Question::with('tags') 应该调用它。相反,如果你要做Question::with('tag')tag 方法应该在Question 模型中定义。

    注意s

    【讨论】:

    • 这些已经定义好了。这不是我遇到问题的步骤。要清楚..我已经可以从对象中正确查询。 $question->tags 给了我一个数组.. 只是它是 LAZY 加载的。我想强制执行 EAGER 加载。
    • $questions = Question::with('tag')->get(); 给出:BadMethodCallException in Builder.php line 2345: Call to undefined method Illuminate\Database\Query\Builder::tag()
    • $questions = Question::with('tags')->get();(应该是标签而不是标签=到问题模型中的函数名)
    • 感谢代表的增加,这现在已被标记为正确。需要明确的是:这是一个“标签”/“标签”复数问题。
    【解决方案2】:

    我已将两个答案都标记为正确:建议的原始语法是正确的,提出的类名问题是最后一个问题。 谢谢大家:

    $questions = Question::with('tags')->get();

    【讨论】:

      猜你喜欢
      • 2021-10-02
      • 2018-03-29
      • 2013-06-10
      • 2019-07-08
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      相关资源
      最近更新 更多