I have an array
//dynamically generated. dynamic number of elements
$keywords = ['google', 'youlense'];
For a exactly matching values of $keywork
mapping to row in content column, i can do following:
$result = \App\Table::where(function($query){
$query->whereIn('content', $keywords);
});
and the result would be somewhat
select * from tables where content IN ('google', 'youlense');
but I want to use LIKE
operator so the result may be like
select * from tables where content LIKE ('%google%', '%youlense%');
I know that is not allowed in mysql but can some one recommend a simple and clean technique to handle this
You can simply use orWhere
method for every keyword and it will equivalent for whereIn
. The code will look like:
$result = \App\Table::where(function($query){
$query->orWhere('content', 'LIKE', '%google%')
->orWhere('content', 'LIKE', '%youlense%')
-> and so on;
});
$result = \App\Table::where(function($query) use($keywords){
foreach($keywords as $keyword) {
$query->orWhere('content', 'LIKE', "%$keywords%")
}
});
Note: gotten query can work very slowly.
You can write a function that will basically do the following :
public function searchByKeywords(array $keywords = array()){
$result = \App\Table::where(function($query) use ($keywords){
foreach($keywords as $keyword){
$query = $query->orWhere('content', 'LIKE', "%$keyword%");
}
return $query;
});
return $result->get(); // at this line the query will be executed only
// after it was built in the last few lines
}