поиск в нескольких таблицах и применение условий во всех таблицах - PullRequest
0 голосов
/ 16 октября 2018

У меня есть две таблицы отношений многие ко многим между ними, эта связь хранится в таблицах ptivot:

  • cpts
  • provider
  • provider_cpts

Я хочу искать в cpts с ключевым словом в двух полях и искать поставщиков с одним ключевым словом, условия должны применяться к таблицам Боха, например, я хочу найти

операция на сердце

в cpts и

oklahoma

в провайдерах, поэтому я хочу получить все cpts, содержащие эти ключевые слова и количество провайдеров, связанных с нимик этому cpt и содержат ключевое слово oklahoma.я использую Laravel, я пытался сделать это

Cpt::where('title', 'like','%' .$keyword.'%')
                ->OrWhere('description','like','%'.$keyword.'%')
                ->whereHas('providers',function($query) use($state){
                    if(!is_null($state)){
                        $query->where('providers.state','like','%'.$state.'%')->orderBy('state')->orderBy('city');
                    }
                })
                ->with('providers','providers.oneCptPrice','prices')
                ->orderBy('id','DESC')->paginate(50);

1 Ответ

0 голосов
/ 16 октября 2018
  1. вам нужно сгруппировать первые два предложения where вместе.

  2. вам нужно установить условия не только для функции whereHas(), но и для *Функция 1008 * тоже.

  3. И вам не нужно order функция wherehas().Потому что вы не получите результаты.Вместо этого вам нужно order with() функция, потому что вы получите результаты там.

Cpt::where(function($query) {
    $query->where('title', 'like','%' .$keyword.'%')
          ->OrWhere('description','like','%'.$keyword.'%')
})
->whereHas('providers',function($query) use($state){
    if(!is_null($state)){
        $query->where('providers.state','like','%'.$state.'%');
    }
})
->with([
    'providers' => function ($query) use ($state) {
        if(!is_null($state)){
            $query->where('providers.state','like','%'.$state.'%')
                  ->orderBy('state')->orderBy('city');
                  ->with('oneCptPrice');
        }
    },
    'price'
])
->orderBy('id','DESC')->paginate(50);
...