Laravel: если какая-либо функция написана в классе модели ... и если мы вызываем ее через view blade.php, как будет вести себя функция - PullRequest
0 голосов
/ 03 мая 2019

Я использую Laravel 5 .если я написал функцию для класса Model и взял ее объект с помощью laravel, красноречиво относящийся к любому файлу вида, например cars.blade.php file, и теперь, если я вызываю любую функцию модели из cars.blade.php

Like Model Class

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 ]

2 голосов
/ 03 мая 2019

Метод, который вы ищете: 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 голос
/ 03 мая 2019

Это лучшая практика для этого? Вы связываете часть VIEW архитектуры MVC с самой моделью, что не является хорошей практикой.

Когда эта функция будет вызываться? : Это запустится, как только шаблонизатор 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 проблеме

Лучший способ сделать это - проверить ответ @Dan.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...