Php 如何使用LIKE-with-where数组检索Laravel中有说服力的行
我有一个数组Php 如何使用LIKE-with-where数组检索Laravel中有说服力的行,php,mysql,sql,laravel,eloquent,Php,Mysql,Sql,Laravel,Eloquent,我有一个数组 //dynamically generated. dynamic number of elements $keywords = ['google', 'youlense']; 要精确匹配映射到内容列中行的$keywork值,我可以执行以下操作: $result = \App\Table::where(function($query){ $query->whereIn('content', $keywords); }); 结果是 select * from tabl
//dynamically generated. dynamic number of elements
$keywords = ['google', 'youlense'];
要精确匹配映射到内容列中行的$keywork
值,我可以执行以下操作:
$result = \App\Table::where(function($query){
$query->whereIn('content', $keywords);
});
结果是
select * from tables where content IN ('google', 'youlense');
但是我想使用LIKE
操作符,所以结果可能是
select * from tables where content LIKE ('%google%', '%youlense%');
我知道这在mysql中是不允许的,但是有人能推荐一种简单而干净的技术来处理这个问题吗?你可以简单地对每个关键字使用
或者where
方法,它将等价于其中的。代码如下所示:
$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%")
}
});
注意:获取的查询可能工作得非常慢。您可以简单地对每个关键字使用或where
方法,它将等效于其中的。代码如下所示:
$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%")
}
});
注意:获取的查询可能运行得非常慢。您可以编写一个函数,基本上可以执行以下操作:
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
}
您可以编写一个函数,该函数基本上将执行以下操作:
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
}
谢谢,但如果我知道只有两个要素,那就行了。在实际场景中,该数组将动态生成,并且项目数量将动态变化。我错了,我没提。当然,用foreach就行了。我会更新答案。但它可能很慢@Eirtazanumber of queries run=$keyword中的元素。。。我说的对吗?不,一个查询中的条件数。请检查下面的答案。。。这将是一个查询。两个答案都是100%相同的,我不知道哪一个是正确答案。斯图克:谢谢,但如果我知道只有两个要素,那就行了。在实际场景中,该数组将动态生成,并且项目数量将动态变化。我错了,我没提。当然,用foreach就行了。我会更新答案。但它可能很慢@Eirtazanumber of queries run=$keyword中的元素。。。我说的对吗?不,一个查询中的条件数。请检查下面的答案。。。这将是一个查询。两个答案都是100%相同的,我不知道哪一个是正确答案。如果$keyword中有三个元素,它会运行多少个mysql查询?1或3one,因为这不是运行查询,这只是构建它,稍后当你得到结果时,查询将立即执行。我同意,我被卡住了,哪个答案标记为正确。请你自己决定,andrejI更新了答案,不要紧,男人:)没关系,接受他的答案,因为他是第一个写的:)如果$keyword中有三个元素,它会运行多少mysql查询?1或3one,因为这不是运行查询,这只是构建它,稍后当你得到结果时,查询将立即执行。我同意,我被卡住了,哪个答案标记为正确。请你自己决定,安德烈吉更新了答案,没关系,男人:)接受他的答案就行了,因为他是第一个写的:)