【问题标题】:How to get object from nested Eager Loading Laravel?如何从嵌套的 Eager Loading Laravel 中获取对象?
【发布时间】:2017-02-26 09:00:48
【问题描述】:

在查询中我使用嵌套急切加载:

$res = User::where("id", 1)->with("categories.categoryAnn.announcements")->get();

在此查询的结果中,我得到了嵌套集合:

Collection->User->categories->categoryAnn->announcements

如何快速获取最后一个嵌套对象announcements

【问题讨论】:

  • 所以,为此我需要做 5 个嵌套循环,这太糟糕了

标签: laravel laravel-5 eloquent laravel-5.4


【解决方案1】:

你可以用相反的方式只得到这样的公告:

$announcements =  Announcement::whereHas('categoriesAnn', function($q) {
  $q->whereHas('categories, function($q) {
      $q->whereHas('user', function($q) {
          $q->where('id',1);
      });
  });
});

这显然是伪代码,因为我不知道你的关系的确切名称,但这样的东西应该可以工作,你不需要任何循环。

【讨论】:

  • 会检查,但在 Laravel 中真的很难做到吗?
  • 如果没有 Eloquent,你会怎么做?在 Laravel 中,您还可以根据需要运行原始查询,或者如果您认为这是更好的方式,则可以使用连接。没有什么能阻止你这样做。
  • 问题很简单,我需要从表异常行中选择未在类别用户中显示的类别的行。
  • 而且解决方案也很简单。如果你想使用你在其他 cmets 中提到的关系,你可以这样做。如果你想使用原始 SQL 查询,你也可以这样做。这取决于您选择的解决方案。
【解决方案2】:

您可以尝试以下方法来简化它:

$categories = User::find(1)->categories()->get(); //loads the categories alone

$announcements = collection([]);

foreach(categories as $category)
{
    $announcements->push($category->categoryAnn->announcements);
}

这里的想法或假设是,对于每个类别,categoryAnn 是一个并且可以有 one-many 公告。

PS:关于效率,我真的不能说,但是,是的,这应该有效。

【讨论】:

  • 我尽量避免额外的循环,我需要使用关系来创建它
  • 你在这里只使用了一个循环,你看,循环中使用了关系。例如。获取所有采购订单,每个订单都有一个产品,对应的产品有很多图片。如果我理解正确,这个描述类似于你的问题。 我需要图片 通过我给出的示例,我能够检索所有与产品相关的图片。
猜你喜欢
  • 2020-05-23
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
相关资源
最近更新 更多