Красноречивый способ фильтрации по внешнему ключу - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть модель Product, в которой есть множество SalePrices (поскольку они меняются со временем), которые хранятся в двух таблицах базы данных, связанных внешним ключом и красноречивыми отношениями:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{

  public function sale_prices()
  {
      return $this->hasMany('App\SalePrices');
  }
}

Что я пытаюсь сделать Это фильтр продуктов на основе входящего запроса Http-запроса, поэтому я получаю список продуктов в моем контроллере:

$products = Product::whereIn('type', $request->types)->where('active', 1);

И затем я проверяю минимальную или максимальную цену и пытаюсь отфильтровать соответственно:

if ($request->has('min_price')) {
    $products->sale_prices()->where('price', '>=', $request->min_price);
}

if ($request->has('max_price')) {
    $products->sale_prices()->where('price', '<=', $request->max_price);
}

 $products = $products->get();

Это не работает, и выдает мне эту ошибку:

Call to undefined method Illuminate\Database\Eloquent\Builder::sale_prices()

Я понимаю, что переменная $ products теперь является коллекцией элементов, но я не уверен, как применить мой фильтр к ним. Я могу через них oop, но как мне применить искомое предложение where?

Ответы [ 2 ]

2 голосов
/ 27 апреля 2020

sale_prices() - это метод объекта Model, его нельзя вызвать Eloquent Builder.

Используйте whereHas , чтобы проверить, какой продукт связан с min_price или max_price.

$products = Product::whereIn('type', $request->types)->where('active', 1);

if ($request->has('min_price')) {
    $products->whereHas('sale_prices', function($query) use ($min_price) {
        $query->where('price', '>=', $min_price);
    });
}

if ($request->has('max_price')) {
    $products->whereHas('sale_prices', function($query) use ($max_price) {
        $query->where('price', '<=', $max_price);
    });
}
$products->whereIn('type', $request->types)->where('active', 1)->get();

1 голос
/ 27 апреля 2020

Попробуйте передать метод get в продуктах.

$products = Product::whereIn('type', $request->types)->where('active', 1)->get();    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...