Как получить только искомые данные с предложением where? - PullRequest
0 голосов
/ 26 сентября 2019

    $data['ads'] = PostAd::where('category_id',$id)      
                          ->orwhere('district_id','LIKE','%'.$location.'%')
                          ->orWhere('condition','LIKE','%'.$condition.'%')
                          ->orWhere('price','>='.$min_price)
                          ->orWhere('price','<='.$max_price)   
                          ->orWhere('fuel',$fuel)
                          ->orWhere('anchalorpradesh',$anchal)
                          ->orWhere('mileage',$mileage)
                          ->orWhere('kilometers',$kilometers)
                          ->orWhere('engine',$engine) 
                          ->get();

Я хочу показать данные, для которых category_id равен $ id.Но всякий раз, когда я пытаюсь найти, он показывает мне все данные в базе данных.Предположим, я хочу найти данные, чей километр равен 24. Есть только одна информация, чей километр равен 24. Но вместо того, чтобы показать, что эти данные показывают мне все данные в базе данных.

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Вы можете использовать метод when для условного добавления предложений к вашим запросам в зависимости от значения, проходящего тест «истина»:

PostAd::query()
    ->when($request->get('category_id'), function ($query, $categoryId) {
        $query->where('category_id', '=', $categoryId);
    })
    ->paginate();

Закрытие, которое вы передаете в качестве второго аргумента, получит два аргумента: экземпляр построителя запросов, который вы можете изменить, и значение, которое вы передали в качестве первого параметра методу when.


Вы также можете сделать еще один шаг вперед и переместить логику фильтрации ввыделенный класс:

class PostAdFilters
{
    protected $request;
    protected $builder;

    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    public function apply(Builder $builder)
    {
        $this->builder = $builder;

        foreach ($this->request->query() as $key => $value) {
            // Convert something like `category_id` to `filterByCategoryId`
            $methodName = 'filterBy' . Str::studly($key);

            if (method_exists($this, $methodName)) {
                // If the method exists, call it
                call_user_func([$this, $methodName], $value);
            }
        }

        // Return the modified query builder
        return $this->builder;
    }

    private function filterByCategoryId($value)
    {
        $this->builder->where('category_id', '=', $value);
    }

    private function filterByKilometers($value)
    {
        $this->builder->where('kilometers', '=', $value);
    }

    // And so on...
}

class PostAd extends Model
{
    public function scopeFilters(Builder $query, PostAdFilters $filters)
    {
        return $filters->apply($query);
    }
}

Затем вы можете внедрить этот класс в свой метод контроллера и применить его к своей модели:

public function search(PostAdFilters $filters)
{
    return PostAd::filter($filters)->paginate();
}

Этот подход основан наhttps://laracasts.com/series/eloquent-techniques/episodes/4

1 голос
/ 26 сентября 2019

Попробуйте что-то вроде этого, добавив условно по выбору параметров поиска

$query = PostAd::query();

if ( isset($id) ) {
    $query = $query->where('category_id',$id);
}

if ( isset($location) ) {
    $query = $query->where('district_id', 'LIKE', '%' . $location . '%');
}

if ( isset($condition) ) {
    $query = $query->where('condition', 'LIKE', '%' . $condition. '%');
}

$result = $query->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...