【问题标题】:Laravel Eloquent's ->load() With Callback Not Affecting ResultsetLaravel Eloquent 的 ->load() 回调不影响结果集
【发布时间】:2023-03-03 18:48:01
【问题描述】:

我正在寻找一个父对象(在此示例中为Person)并在其上加载一堆关系,其中许多具有传递给->load() 的自定义查询参数作为回调。例如:

public function some_method(Request $request, Person $person) {

$person->load([
   'things' => function ($query) {
      $query->where('status', 'active')
         ->whereDate('created_at', '<', '2021-01-01');
   },
   'other_things' => function ($query) {
      $query->where('status', 'active')
         ->where('color', 'red');
   },
   ... Many more callback-based relationships ...
]);

当我将其传递给带有 return view('...', compact('person')) 的 Blade 模板并开始循环一些这样的关系时:

@foreach ($person->things as $thing)
{{ $thing->status == 'active' ? 'Active' : 'Inactive' }}
@endforeach

我从控制器中的-&gt;load() 函数中获得了许多不活动的Thing 不符合-&gt;whereDate() 查询的Thing。我希望load([...]) 中的自定义回调过滤结果关系,但是当访问 Blade 模板中的关系时,似乎执行查询时好像没有回调函数。

我尝试过使用with(),但考虑到我在URI 中注入Person,这似乎不是正确的方法。我也尝试过将-&gt;map() 与各种循环结构一起使用,但这些也会被似乎是对数据库的第二轮 Eloquent 调用所覆盖。

我需要做什么才能让 Blade 模板“尊重”我希望用来过滤加载到父对象上的记录的自定义回调查询?

谢谢!

【问题讨论】:

  • 你用的是什么版本的 laravel? laravel.com/docs/8.x/eloquent-relationships#lazy-eager-loading.
  • 8,您的链接显示的正是我正在做的。但是,那些自定义查询参数并没有反映在 Blade 文件中;检索关系的 SQL 查询在没有任何 WHERE statements 的情况下执行。
  • 可能是一个愚蠢的问题,但您是否尝试过使用$person = $person-&gt;load(...,所以用load 结果覆盖$person
  • 是的,很遗憾。我也尝试过$person = collect($person-&gt;load(...)),但这会导致许多其他问题,例如未转换时间戳、未解析 JSON 等。
  • 并禁用延迟加载laravel-news.com/…?

标签: php laravel eloquent


【解决方案1】:

您可以尝试一些事情。

选项 1

这应该不是必需的,但您可以尝试用加载的结果覆盖 $person

$person = $person->load();

选项 2

从 Laravel 8.43 开始,您可以在 app/Providers/AppServiceProvider.phpboot 方法中使用 Model::preventLazyLoading(! app()-&gt;isProduction());。这将防止任何延迟加载,也在视图中。如果有延迟加载会返回错误。image source

【讨论】:

  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 2019-09-08
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
相关资源
最近更新 更多