如何在Laravel 8中为未知数量的orWhere条件编写Eloquent查询



我一直在搜索和搜索,我找不到这个问题的答案。我需要做一个查询,其中我将有一个动态数量的OR子句。文档似乎建议有可能将条件数组传递给whereorWhere,但是当我尝试这样做时,我最终没有结果。

我需要的查询看起来像这样:

SELECT * FROM tags WHERE name = $name1 OR name = $name2 ... OR name = $nameN;

我创建了一个条件数组,并像这样传递给orWhere:

// a user's tags for which all corresponding questions are queried
$user = User::with('tags')-where('id', Auth::user()->id)-get();
// an array of conditions formatted like the docs specify
$conditions = $user->tags->map(function ($item) {
return ['name', '=', $item->name];
})->all();
/* 
outputs a plain array like this: 
[
["name", "=", "php"],
["name", "=", "mysql"],
["name", "=", "laravel"],
]
*/
$tags = Tag::with([
'questions.answers', 
'questions.user.answers',
'questions.tags'
])
->orWhere($conditions)
->get();

结果应该是与用户的标签相匹配的标签集合,以及它们相关的问题。但是我什么也没得到。我已经尝试重写这个查询在一堆不同的方式,没有急于加载相关的数据,以及,没有什么区别。如果我在orWhere子句之前添加where子句,那么查询只返回由where子句过滤的数据。

我对此束手无策。我已经想出了一个变通办法,但它很复杂,而且真的不理想。我应该能够使用一个简单的orWhere与条件数组,而不是诉诸复杂的黑客。有人能指出我做错了什么和/或我如何才能达到我想要的结果吗?提前谢谢。

你试过这样做吗?

// For the first time, you need to use where statement
$tags = Tag::where(...);
// Then for the remaining conditions, you could use looping
// for chaining the orWhere statements
foreach ($queryStatements as $statement) {
$tags = $tags->orWhere(...);
}
// Then after all queries have been applied, call the get() method
$res = $tags->get();

这就是我将如何做,希望这有助于!

如果您将数组放入orWhere()方法中。你的查询应该是这样的:

`select * from `tags` where (`name` = ? and `name` = ? and `name` = ?) and `tags`.`deleted_at` is null`

正如你所看到的,它是搜索and的每一个项目,你放入。下面是我解决这个问题的方法:

$query = Tag::with([
'questions.answers',
'questions.user.answers',
'questions.tags'
])->query();
//Foreach item in array
foreach ($datas as $data) {
$query->orWhere('name', '=', $data);
}
//Excute the query
$tags = $query->get();

希望这能解决你的问题。

如果您只是想通过名称查找标签,您可以使用whereIn()方法。

// Get array of current authenticated user's tags
$tags = auth()->user()->tags()->pluck('name');
/*
outputs an array like this:
['php', 'laravel', 'mysql']
*/
$tags = Tag::with([
'questions.answers',
'questions.user.answers',
'questions.tags'
])
->whereIn('name', $tags)
->get();


注意:whereIn()方法的第一个参数是你要搜索的列名,第二个参数是你要搜索的值的数组。

相关内容

  • 没有找到相关文章

最新更新