Laravel: orWhere поисковый запрос - PullRequest
0 голосов
/ 13 июня 2018

У меня есть простой запрос в моей модели для получения данных.Теперь я хочу выполнить поиск с companyname. Моим кодом запроса:

 $searchablePost    = Post::with(['product','postattribute.attribute.category','user.userDetails'])
                     ->whereIn('status',$is_or_active)
                     ->whereIn('product_id', $userApprovalProductIDs)
                     ->whereIn('demand_or_supply', $is_demand_supply)
                     ->offset($offset)->limit($limit)
                     ->orderBy('id','desc');

Теперь я получил 6 rows в этом 6 rows Я хочу отфильтровать данные с companyname, которые я получаю через запятуюabcCompany,indCompany.

array:2 [
  0 => "abccompany"
  1 => "indcompany"
]

Что я пытаюсь:

  if($companyname !="") {
        $companyDetail    = Explode(',',$companyname);
        $searchablePost->whereHas('user.userDetails', function ($query) use ($companyDetail) {
                $i=1;
                foreach ($companyDetail as $search_with_compayname) {
                        if(count($companyDetail)>0 && $i==1) {
                            $query->where('company','LIKE',"%{$search_with_compayname}%");
                        } else {
                            $query->orWhere('company','LIKE',"%{$search_with_compayname}%");
                        }
                $i++;
                }
        });
    }

Это хорошо или есть какой-то другой способ хорошего поиска?

1 Ответ

0 голосов
/ 13 июня 2018

Если вы хотите выполнить поиск в CSV-списке названий компаний, MySQL сделает доступной функцию FIND_IN_SET.Я думаю, что вы можете просто добавить предложение whereRaw к вашему текущему запросу Laravel:

 $searchablePost = Post::with(['product','postattribute.attribute.category','user.userDetails'])
    ->whereIn('status', $is_or_active)
    ->whereIn('product_id', $userApprovalProductIDs)
    ->whereIn('demand_or_supply', $is_demand_supply)
    ->whereRaw('FIND_IN_SET(company, ?) > 0', [$search_with_compayname])
    ->offset($offset)
    ->limit($limit)
    ->orderBy('id', 'desc');

Хотя вышеприведенное может сработать, лучший долгосрочный подход состоит в том, чтобы избежать CSV и других ненормализованных данных в вашей базе данных.В идеале у вас должна быть таблица, содержащая список названий компаний, с одним именем в каждой записи.Затем вы можете присоединиться или использовать запрос EXISTS, чтобы ответить на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...