【发布时间】: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
我从控制器中的->load() 函数中获得了许多不活动的Thing 不符合->whereDate() 查询的Thing。我希望load([...]) 中的自定义回调过滤结果关系,但是当访问 Blade 模板中的关系时,似乎执行查询时好像没有回调函数。
我尝试过使用with(),但考虑到我在URI 中注入Person,这似乎不是正确的方法。我也尝试过将->map() 与各种循环结构一起使用,但这些也会被似乎是对数据库的第二轮 Eloquent 调用所覆盖。
我需要做什么才能让 Blade 模板“尊重”我希望用来过滤加载到父对象上的记录的自定义回调查询?
谢谢!
【问题讨论】:
-
你用的是什么版本的 laravel? laravel.com/docs/8.x/eloquent-relationships#lazy-eager-loading.
-
8,您的链接显示的正是我正在做的。但是,那些自定义查询参数并没有反映在 Blade 文件中;检索关系的 SQL 查询在没有任何
WHEREstatements 的情况下执行。 -
可能是一个愚蠢的问题,但您是否尝试过使用
$person = $person->load(...,所以用load结果覆盖$person? -
是的,很遗憾。我也尝试过
$person = collect($person->load(...)),但这会导致许多其他问题,例如未转换时间戳、未解析 JSON 等。 -
并禁用延迟加载laravel-news.com/…?