Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用LIKE-with-where数组检索Laravel中有说服力的行_Php_Mysql_Sql_Laravel_Eloquent - Fatal编程技术网

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,因为这不是运行查询,这只是构建它,稍后当你得到结果时,查询将立即执行。我同意,我被卡住了,哪个答案标记为正确。请你自己决定,安德烈吉更新了答案,没关系,男人:)接受他的答案就行了,因为他是第一个写的:)