我正在使用 Laravel 5 。如果我已经在Model类上编写了一个函数,并且通过laravel雄辩地将其对象当作cars.blade.php
文件之类的任何视图文件,现在如果我从cars.blade.php
调用了任何模型函数
像模型类
public function totalModels() {
return App\Models\CarModel::where('id',$this->modelId)->count();
}
<span>Available Models : {{ $car->totalModels() }}</span>
所以我的问题是
何时调用此函数?
此功能会使页面变慢吗?
这是最佳做法吗?
如果有任何foreach循环,那么此函数将如何作用于每个对象?
谢谢
答案 0 :(得分:2)
您要搜索的方法是withCount
:
在汽车模型中创建与App\Models\CarModel
的关系,并急切地向其加载withCount
,以防止在循环中发送太多查询并导致页面速度减慢:
Car.php
namespace App\Models;
class Car
{
// ...
public function models()
{
return $this->hasMany('App\Models\CarModel', 'id', 'modelId');
}
// ...
}
CarsController.php
namespace App\Http\Controllers;
class CarsController extends Controller
{
// ...
public index()
{
$cars = App\Models\Car::withCount('models')->get();
return view('cars', compact('cars'));
}
// ...
}
cars.blade.php
@foreach ($cars as $car)
{{-- ... --}}
<span>Available Models: {{ $car->models_count }}</span>
{{-- ... --}}
@endforeach
答案 1 :(得分:1)
这是最佳做法吗? 您正在将MVC体系结构的VIEW部分耦合到Model本身,这不是一个好习惯。
何时调用此函数?: 这将在laravel模板引擎渲染该刀片后立即运行。
将会发生什么:
它将对数据库进行一次额外的调用以获取所有行,然后执行collection count()
,这比mysql count()
慢得多。
此功能会使页面变慢吗?是。至少可以提高查询性能:
App\Models\CarModel::select(DB::raw('count(*) as total_cars'))
->where('id',$this->modelId)
->pluck('total_cars');
此查询类似于通过关系通过withCount()
方法发生的情况。
如果有任何foreach循环,那么此功能将如何作用于每个对象? 如果您要传给对象并进行调用以获取计数,则为传给对象,将对数据库进行额外的调用,类似于N+1 problem
一种更好的方法,请查看@Dan答案。