我目前正在尝试在我的数据库中搜索关键字。因此,我用逗号分隔了一个字符串,所以我得到一个包含可变数量元素的数组(一个关键字)。
我知道我可以使用这样一个雄辩的结构:
$products = Product::where([['keywords', 'LIKE', %samsung%], [keywords, 'LIKE', 's7']])->paginate(15);
查找包含关键字samsung,galaxy,s7
的商品。
现在我需要这个东西,但是为可变数量的搜索查询部分自动生成,所以对于数组中的每个关键字,我需要添加一个['keywords','LIKE','...'] ...
如何使用Laravels Eloquent做到这一点?
答案 0 :(得分:4)
使用闭包。首先,确保将关键字列表存储到数组等中。然后......
$keywords = ['samsung', 's7', 'what else'];
$products = Product::where(function ($query) use ($keywords) {
foreach ($keywords as $keyword) {
$query->orWhere('keyword', 'like', $keyword);
}
})->paginate(15);
其他例子
$keywords = [
['name', 'LIKE', $searchQuery],
['category_id', '=', $selectedSubcategory],
];
$products = Product::where(function ($query) use ($keywords) {
foreach ($keywords as $keyword) {
$query->where($keyword);
}
})->paginate(15);
除了其他
$keywords = [
['name', 'LIKE', $searchQuery],
['category_id', '=', $selectedSubcategory],
['please_id', '=', $learnPhpArray],
];
$products = Product::query();
foreach ($keywords as $keyword) {
$products = $products->where($keyword);
}
return $products->paginate(15);
orWhere做了什么?它是否将查询部分与AND?
连接起来不,OR
。作为反向(?),where
本身默认为AND
。
参考
答案 1 :(得分:3)
不仅仅是生成阵列吗?或者我误解了这个问题?
<?php
$keys = ['samsung', 'lg', 'sony', 'nokia', 'apple'];
$keywords = [];
foreach($keys as $key){
$keywords[] = ['keywords', 'LIKE', '%'.$key.'%'];
}
$products = Product::where($keywords)->paginate(15);
答案 2 :(得分:0)
你可以这样做:
$query = "Samsung galaxy S7"; // Or whatever the query is
$words = preg_split("/[ ,.]/",$query); //Split on space comma or dot. Maybe need more?
$queries = array_map(function ($word) {
return [ "keywords", "LIKE", "%$word%" ];
}, $words); //Transform single words to array of queries
$products = Product::where($queries)->paginate(15);
检查代码的第一部分如何工作:https://eval.in/730772
答案 3 :(得分:0)
laravel 5.6
$keyWords = KeyWordModel::all();
$keyWordQuerys = [];
foreach ($keyWords as $key => $item) {
$keyWordQuerys[$key] = ['title', 'like', '%'.$item->name.'%'];
}
$contents = ContentModel::query();
foreach ($keyWordQuerys as $key => $item) {
$contents = $contents->orwhere([$item]);
}
$contents = $contents->orderBy('pubDate', 'DESC')->get();