代码之家  ›  专栏  ›  技术社区  ›  whiterook6

我可以使用联接来模拟laravel急切加载吗?

  •  2
  • whiterook6  · 技术社区  · 8 年前

    我读过几篇文章,讨论了为什么急切加载使用多个查询而不是连接 here , here here 然而,我有一种情况,我认为应该使用联接而不是急切加载。我将如何构造查询,以便能够访问子对象,就好像它是一个通常急切加载的对象一样?

    示例:获取住在某条街道上的人,并同时加载该地址。我不想加载所有人的地址,因为他住在很多地方;仅匹配查询的位置。在急切加载和whereHas的情况下,我必须复制查询,而且查询并不总是这么简单:

    People::with(['address', function($query) use ($street_name){
      return $query->where('street_name', $street_name);
    }])->whereHas('address', function($query) use ($street_name){
      return $query->where('street_name', $street_name);
    })->get();
    

    可以是

    People::query()->join('address', function($join){
      $join->on(...)
    })->where('street_name', $street_name);
    

    问题是我不能使用这个:

    $person->address
    

    是否有一种方法来加入并按摩它(使用选择?)所以它看起来像是迫不及待地加载的?

    1 回复  |  直到 7 年前
        1
  •  5
  •   Kyle    8 年前

    您可以执行以下操作:

    People::join('addresses', 'addresses.people_id', '=', 'people.id')
    ->selectRaw('people.*')
    ->where('street_name', $street_name)
    ->with('addresses')
    ->get();
    

    这使用联接和急切加载。

    仅通过联接,您可以访问以下内容:

    $person->street_address