@jazzus

Что лучше – дублировать запрос к базе или дублировать объект в методах Laravel?

Задача реализовать функцию скачивания файлов у продуктов. Что делаю

Получаем продукт из базы
$product=$this->product($slug);

Запрос файла из контроллера в трейт.
$file = $this->file($product, $type);
Т.е. я передаю объект продукта целиком.

В трейте:
public function file($product, $type)
      {
               //Получаем файлы
              $files = $this->files($product);
              //Получаем файл нужного типа
              $file=$files->where('type', $type)
                               ->first();
              return $file;
      }

      public function files($product)
      {
              $files=$product->files;
              return $files;      
      }


И вот здесь у меня затык. Можно ли вот так передавать целый объект продукта по цепочке методов? Или будет лучше передать slug и сделать в трейте дублирующий запрос БД для получения продукта?
Например
В контроллере:
$file = $this->file($product_slug, $type);
В трейте:
public function product($product_slug)
      {
              $product=Product::where('slug', $product_slug)
                              ->first();
              return $product;      
      }

      public function file($product_slug, $type)
      {
              $files = $this->files($product);
              $file=$files->where('type', $type)
                          ->first();
              return $file;
      }

      public function files($product_slug)
      {
              $product=$this->product($product_slug);
              $files=$product->files;
              return $files;      
      }


Сразу напишу: я новичок, пытаюсь разобраться в основах, в данный момент на стадии начального изучения поэтому и спрашиваю основы)
  • Вопрос задан
  • 182 просмотра
Пригласить эксперта
Ответы на вопрос 2
@vism
Вы пытаетесь сунуть разбиение по методам туда куда не нужно.
Начитались статей и решили применять. Зачем сами не понимаете, но надо ведь, так?

KIS.

File::where('type', $type)
->whereHas('products', function ($query) {
    $query->where('slug', '=', $product_slug);
})
->first();

или


File::select('files.*')
->leftJoin('products' ... условия джоина)
->where('files.type', $type)
->where('products.slug', $product_slug)
->first();


вот это уже можно засунуть в отдельный метод.
Ответ написан
Комментировать
@jazzus Автор вопроса
Да нет я не просто так делю) Здесь разделил из-за многократного применения этих методов в контроллерах. $product не только для поиска файлов. Он в шаблоне и контроллере используется. Поэтому нужно делить на методы/переменные. + проверить, что они существуют
В данный момент там уже все переделал. file получаю в модели Product.
public function superfile()  {  
return $this->file()->where('type', 10);
}


и в контроллерах

$superfile=$product->superfile();

Сам вопрос уже понятен. metod($product) не дублирует объект, а ссылается на него. Я думал, что дублирует)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы