Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.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 将orWhere()追加到动态子查询_Php_Laravel_Eloquent - Fatal编程技术网

Php 将orWhere()追加到动态子查询

Php 将orWhere()追加到动态子查询,php,laravel,eloquent,Php,Laravel,Eloquent,用户可以提交带有输入的搜索表单,例如狗猫+鸟。这将返回所有标题包含(dog或cat)和bird的帖子 我认为我需要在子查询中附加dog和cat,例如: 受保护函数或类似函数(字符串$column,字符串$value):生成器 { 返回$this->builder ->其中(函数(生成器$subQuery)使用($column,$value){ $subQuery->orWhere($column,'like','%.$value.'%');//dog //$subQuery->orWhere($

用户可以提交带有输入的搜索表单,例如
狗猫+鸟
。这将返回所有标题包含(
dog
cat
)和
bird
的帖子

我认为我需要在子查询中附加
dog
cat
,例如:

受保护函数或类似函数(字符串$column,字符串$value):生成器
{
返回$this->builder
->其中(函数(生成器$subQuery)使用($column,$value){
$subQuery->orWhere($column,'like','%.$value.'%');//dog
//$subQuery->orWhere($column,'like','%.$value.'%');//cat
//$subQuery->orWhere($column,'like','%'.$value.'%');等等。。。
});
}

上面的
orLike
是循环中的我的函数,它为每个解析的可选搜索词(
dog
cat
)运行

如何使每个可选术语(
dog
cat
)附加到
$subquery
,并为每个术语添加
或where()

显然,现在它启动了一个新的
where()
,每个术语都有一个子查询

不知道我是否足够清楚。基本上,我正在尝试构建一个相当简单的搜索输入,用户可以在其中键入
+bird-cat-dog-duck
意思是
bird
必须在标题中,而
cat
不能在标题中,并且(包含
dog
duck

编辑:根据评论中的请求提供其他信息

/*
用法:return$this->parseLike('title','+狗猫鸟象鸭');
*/
受保护函数parseLike(字符串$column,字符串$value)
{
//[…]无关代码
/*
$terms是术语的集合,例如:
+狗
猫
-鸟
大象
鸭子
*/
返回$terms
->唯一的()
->映射(函数(字符串$term){
开关(\substr($term,0,1)){
格“+”:
return['like'=>\substr($term,1)];//对于带有运算符“+”的术语(如“+dog”)调用函数“like()”
案例'-':
return['notLike'=>\substr($term,1)];//函数“notLike()”用于带有运算符“-”的术语,例如“-bird”
违约:
return['orLike'=>$term];//函数“orLike()”用于不带运算符的术语,如“大象”、“鸭子”或“猫”
}
})
->每个(功能($组合)使用($列){
收取($组合)
->拒绝(功能($term){
返回空($期限);
})
->每个(函数(字符串$术语,字符串$运算符)使用($列){
返回$this->{$operator}($column,$term);
});
});
}

看看这个例子,我相信您可以将它集成到您的代码中

你所需要的只是用你需要的值创建数组,2.不需要的值,3.可能需要的值

    $mustBe = ['dog', 'cat'];
    $mustNotBe = ['bird'];
    $mayBe = ['tiger', 'lion'];

    $model = SomeModel::query();

    foreach ($mustBe as $term){
        $model->where('title', 'like', '%'. $term . '%');
    }
    foreach ($mustNotBe as $term){
        $model->where('title', 'not like', '%'. $term . '%');
    }

    if($mayBe){
        $model->where(function ($query) use ($mayBe) {
            foreach ($mayBe as $term){
                $query->orWhere('title', 'like', '%'. $term . '%');
            }
        });
    }

    $result = $model->get();
    dd($result);

    // this builder will return something like this
    $result = SomeModel::where('title', 'like', '%dog%') // dog must be
        ->where('title', 'like', '%cat%') // cat must be
        ->where('title', 'not like', '%bird%') // bird must not be
        ->where(function ($query) {
            $query->orWhere('title', 'like', '%tiger%') // tiger may be
                  ->orWhere('title', 'like', '%lion%'); // lion may be
        })
    ->get(); 

你能分享一下你调用
orLike(…)
方法“我的函数在一个循环中为每个解析的可选搜索项运行”的地方/方式吗?我想你需要将所有的项传递给函数,并在闭包中循环它们。您可能可以使用
$subQuery->where
查找子查询并对其进行更改,但这似乎是一个潜在的问题。我不确定修改
$subQuery->where
是否很好,我一眼就想到了,但这似乎是一个很难在将来阅读/维护的大混乱。一定有一种更优雅的方法可以做到这一点。我真的建议你阅读Elasticsearch。这种搜索确实更容易和更快地使用它,尽管它为您的应用程序增加了另一个复杂性层(另一个服务、ram使用等),这确实有效,而且可读性和灵活性都很好。不是我所期望的,而是优雅和简单。谢谢你抽出时间。