Laravel фильтровать результаты на основе атрибутов - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть одна основная таблица под названием «двигатели» и их атрибуты, которые я сохраняю в под-таблице «motor_attributes». Атрибуты являются динамическими, и они могут содержать любой идентификатор и значение. Отношения это отношения один ко многим. Проблема в том, что я не могу найти любой атрибут. Это дает мне те же элементы родительской таблицы "enteries".

Я хочу сделать это более ясным. Каждый раз это дает мне 6 закусок. Даже если я изменю значение $ request-> get ('body_condition'). вручную. потому что его строка запроса. И я хочу фильтровать моторы лучше всего по этим признакам. Любая помощь будет оценена. Это просто скрыть атрибуты не основной рекламы. Любая помощь будет оценена. Заранее спасибо

`` `` `` `` `` `

        $perPage = 20;
        $motorQuery = Motor::with(['advertisementPhotos', 'country', 'city', 'customer.dealer','favouriteAd', 'adAttributes' => function ($query) use ($request){

             // dd($request->get('body_condition'));
             $query->where('integer_value',$request->get('body_condition'));
             $query->with('attribute');
             $query->with('adAttributeValue');
             $query->where('show_listing_page',1);
        //;
        //  return $query->take(2);

          }])
        ->where('status', 1)
        ->where('date_expiry', '>=', date('Y-m-d') . ' 00:00:00');


    if (request()->filled('city')) {
        $motorQuery->where('city', request()->get('city'));
    }
    if (request()->filled('keywords')) {
        $motorQuery->where('title', 'like', '%' . request()->get('keywords') . '%');
    }
    if (request()->filled('from_price')) {
        $motorQuery->where('price', '>=', request()->get('from_price') );
    }
    if (request()->filled('to_price')) {
        $motorQuery->where('price', '<=', request()->get('to_price') );
    }


    if (request()->hasCookie('country')) {
        $motorQuery->where('country', request()->cookie('country')->first()->id);
    }

    $data['allMotors'] =  $allMotors = $motorQuery->orderBy('featured', 'desc')->orderBy('date_posted', 'desc')->paginate($perPage);

`` `

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Хорошо, так как я вижу это из вашего кода, вы пытаетесь фильтровать двигатели здесь и используете фильтры в неправильном месте.

Фильтры в предложении with будут фильтровать только загружаемые отношения, а не родительскую модель.

Чтобы отфильтровать родительскую модель, находясь в синтаксисе Eloquent, используйте «has» или ярлык «whereHas»:

$perPage = 20;
$bodyCondition = request('body_condition');
$motorQuery = Motor::with(['advertisementPhotos', 'country', 'city', 'customer.dealer','favouriteAd', 'adAttributes.attribute', 'adAttributes.adAttributeValue'])
    ->whereHas('adAttributes', function ($q) use ($bodyCondition) {
        $q->where('integer_value', $bodyCondition)
          ->where('show_listing_page',1);
    })
    ->where('status', 1)
    ->where('date_expiry', '>=', date('Y-m-d') . ' 00:00:00');
0 голосов
/ 30 апреля 2018

Вы должны попробовать использовать объединение для фильтра атрибутов. Также, если какая-либо таблица связана с атрибутом и вам нужны данные из этой таблицы, также включите в эти таблицы соединение. Попробуйте что-то вроде этого:

$motorQuery = Motor::with(['advertisementPhotos', 'country', 'city', 'customer.dealer','favouriteAd'])
            ->join('ad_attribute_value', 'ad_attribute_value.motor_id', '=', 'motor.id')
            ->where(function($query) use ($request){
                       if($request->get('body_condition') != '')
                           $query->where('integer_value', '=', $request->get('body_condition'))
            })
            ->where('status', 1)
            ->where('date_expiry', '>=', date('Y-m-d') . ' 00:00:00');

Посмотрите, сработает ли это для вас.

...