有没有办法在 Blade 中缓存变量?

Posted

技术标签:

【中文标题】有没有办法在 Blade 中缓存变量?【英文标题】:Is there a way to cache variables in Blade? 【发布时间】:2020-03-17 06:04:00 【问题描述】:

我正在使用compact 函数从我的控制器将一个变量传递给我的视图,然后可以在我的视图中访问该变量。但是,每次我访问这个变量时,Laravel 都会对数据库进行越来越多的调用。

return view('dashboard.overview', compact('aircraft', 'current_location', 'current_flight'));

然后在我的 Blade 中,我像这样调用 Vue 组件:<badge--aircraft--financed :data-aircraft=" $aircraft "></badge--aircraft--financed>,这会产生 10 个查询。如果我复制这一行,Debugbar 显示我做了 20 个查询,其中 10 个是重复的。 Blade是否默认不缓存$aircraft变量?

【问题讨论】:

aircraft 到底有什么? 您是否使用 Aircraft 模型的 $appends 属性附加数据?或有任何访问者? 是的,我有很多使用$appends 定义的访问器,但我正在尝试找到一种方法来选择性地加载这些here。是这个问题吗? 如果他们正在触及未加载的关系的关系方法或动态属性,是的......如果是这种情况,他们会在每次使用访问器时引发查询......你就是字面意思在访问器中进行查询 嗯,好的。除了将它们添加到appends 数组之外,有没有办法在需要时预加载访问器? 【参考方案1】:

Laravel 只缓存刀片模板,不缓存变量。 您可以在控制器中缓存变量 https://laravel.com/docs/6.x/cache#cache-usage

另外,为了避免大量查询,您可以在获取 $aircraft 模型时调用with() 方法。 https://laravel.com/docs/6.x/eloquent-relationships#eager-loading

【讨论】:

谢谢,但with() 仅适用于关系,而不适用于属性,这似乎是这里的问题。【参考方案2】:

这不是因为任何缓存。由于__toStringtoJson,您的模型正在序列化。这考虑了您定义的要附加到$appends 中的数据的访问器。您有正在执行数据库查询的访问器。如果您有 10 个访问器并且您正在其中进行查询,那么对于您序列化的每个 Aircraft 模型,您将生成 10 个查询。

您应该避免这种情况,检查关系是否已加载并使用已加载的关系而不是生成新查询并尝试尽可能多地进行预加载。

【讨论】:

太好了,谢谢。因此,如果我在 $aircraft 模型上有一个名为 flight() 的关系,我会使用范围来获取当前航班吗?目前我检查到达时间,如果这是空的,则返回第一条记录。从属性 ($this->flights()) 访问关系不会进行额外的查询吗?

以上是关于有没有办法在 Blade 中缓存变量?的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel->Blade 中放置一些变量的最佳方法

Blade - 将变量打印到变量中

如何在 Blade 模板中全局使用变量

Laravel教程 三:视图变量传递和Blade

在带有 Blade 的 Laravel 4 中看不到内容视图中的变量

Laravel 5 - 所有模板中都可用的全局 Blade 视图变量