2016-07-28 11 views
0

Я пытаюсь создать форму поиска с laravel, но я не могу получить предложение where, чтобы работать.

Laravel - Where Clause не работает

$term = $request->input('term'); 

$count = DB::table('members as m') 
     ->where(DB::raw('m.member_first_name'), 'LIKE', "%$term%") 
     ->orWhere(DB::raw('m.member_last_name'), 'LIKE', "%$term%") 
     ->orWhere(DB::raw('m.member_business_address'), 'LIKE', "%$term%") 
     ->orWhere(DB::raw("concat('m.member_first_name',' ','m.member_last_name')"), 'LIKE', "%$term%") 
     ->orWhere(DB::raw("concat('m.member_last_name',' ','m.member_first_name')"), 'LIKE', "%$term%") 
     ->orWhere(DB::raw("concat('m.member_name_affix',' ','m.member_last_name',' ','m.member_first_name')"), 'LIKE', "%$term%") 
     ->orWhere(DB::raw("concat('m.member_first_name',' ','m.member_name_affix',' ','m.member_last_name')"), 'LIKE', "%$term%") 
     ->count(); 

var_dump($count); 



var_dump ($ COUNT) всегда возвращает все записи базы данных, независимо от того, что термин поиска.


Это мой первый проект Laravel, и я был бы очень благодарен за любую помощь.

+1

do 'dd (DB :: getQueryLog());' после var_dump, чтобы проверить, что производится, и отправить его здесь. – Kamran

+0

И чем выглядит сгенерированный запрос перед его исполнением? – Walf

ответ

2

Возможно попробовать заключени запрос в общий где:

$count = DB::table('members as m') 
     ->where(function ($q) { 
      $q->where(DB::raw('m.member_first_name'), 'LIKE', "%$term%") 
      ->orWhere(DB::raw('m.member_last_name'), 'LIKE', "%$term%") 
      ->orWhere(DB::raw('m.member_business_address'), 'LIKE', "%$term%") 
      ->orWhere(DB::raw("concat('m.member_first_name',' ','m.member_last_name')"), 'LIKE', "%$term%") 
      ->orWhere(DB::raw("concat('m.member_last_name',' ','m.member_first_name')"), 'LIKE', "%$term%") 
      ->orWhere(DB::raw("concat('m.member_name_affix',' ','m.member_last_name',' ','m.member_first_name')"), 'LIKE', "%$term%") 
      ->orWhere(DB::raw("concat('m.member_first_name',' ','m.member_name_affix',' ','m.member_last_name')"), 'LIKE', "%$term%") 
     }) 
     ->count(); 
+0

Спасибо! Он работает сейчас! Я отвечу на ваш ответ через 7 минут! – Schwesi

+0

@kringeltorte whey вы не используете 'whereRaw()' вместо 'where (DB :: raw())' и используя ''% $ term% "' непосредственно в построителе запросов, некоторые могут применить 'sql injection' здесь. – Avishek

+0

@Avishek Термин часть этой функции по-прежнему обрабатывается Eloquent для предотвращения SQL-инъекции. Я не на 100%, но я думаю, что, используя whereRaw в целом, где это предложение будет обходить методы санобработки Eloquents и открыть SQL-инъекцию. – Jono20201

0

Вы используете и/или вместе, что, конечно, не удастся. Попробуйте следующее:

$count = DB::table('members as m') 
    ->where(DB::raw('m.member_first_name'), 'LIKE', "%$term%") 
    ->where(function ($query) { 
      $query->where(DB::raw('m.member_last_name'), 'LIKE', "%$term%") 
       ->orWhere(DB::raw('m.member_business_address'), 'LIKE', "%$term%")); 
     }) 
0

Просто попробуйте этот код, и если вы получили некоторую синтаксическую ошибку, то попробуйте изменить ' символы здесь и there..as я не могу проверить его перед столбом ..

$term = "%".$request->input('term')."%"; 
$count = DB::table('members as m') 
     ->where('m.member_first_name', 'LIKE', $term) 
     ->orWhere('m.member_last_name', 'LIKE', $term) 
     ->orWhere('m.member_business_address', 'LIKE', $term) 
     ->orWhereRaw('(concat_ws(m.member_first_name,m.member_last_name) LIKE ?)',[$term]) 
     ->orWhereRaw('(concat_ws(m.member_last_name,m.member_first_name) LIKE ?)',[$term]) 
     ->orWhereRaw('(concat_ws(m.member_name_affix,m.member_last_name,m.member_first_name) LIKE ?)',[$term]) 
     ->orWhereRaw('(concat_ws(m.member_first_name,m.member_name_affix,m.member_last_name) LIKE ?)',[$term]) 
     ->count(); 

var_dump($count); 

вы можете использовать whereRaw() не нужно ставить DB::raw() внутри where().