Laravel:如果在模型类中编写了任何函数...并且如果我们通过view blade.php调用该函数的行为

时间:2019-05-03 07:36:23

标签: php laravel eloquent

我正在使用 Laravel 5 。如果我已经在Model类上编写了一个函数,并且通过laravel雄辩地将其对象当作cars.blade.php文件之类的任何视图文件,现在如果我从cars.blade.php调用了任何模型函数

像模型类

Car.php

public function totalModels() {
    return App\Models\CarModel::where('id',$this->modelId)->count();
}

Cars.blade.php

<span>Available Models : {{ $car->totalModels() }}</span>

所以我的问题是

何时调用此函数?
此功能会使页面变慢吗?
这是最佳做法吗?
如果有任何foreach循环,那么此函数将如何作用于每个对象?

谢谢

2 个答案:

答案 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答案。