我使用 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 个是重复的。默认情况下,刀片式服务器不会缓存$aircraft
变量吗?
Laravel只缓存刀片模板,不缓存变量。 您可以在控制器中缓存变量 https://laravel.com/docs/6.x/cache#cache-usage
此外,为了防止大量查询,您可以在获取$aircraft模型时调用with()
方法。 https://laravel.com/docs/6.x/eloquent-relationships#eager-loading
这不是因为任何缓存。由于toJson
__toString
,您的模型正在序列化。这考虑了您定义的要追加到$appends
中的数据的访问器。您有正在执行数据库查询的访问器。如果您有 10 个访问器,并且您正在其中执行查询,那么对于您序列化的每个飞机模型,您将生成 10 个查询。
您应该避免这种情况,检查关系是否已加载并使用加载的关系,而不是生成新查询,并尝试尽可能多地预先加载。