我试图在db中创建具有多个条件的简单搜索查询。
我想在db帖子中搜索附加到帖子的标记,并检查帖子标题中的搜索字词。
到目前为止,我提出了检查多个帖子的查询,但我现在正在努力检查帖子标题中的多个单词。
$search = $request['search'];
$searchArr = explode(' ',$request['search']);
$searchTitle = [];
foreach ($searchArr as $search){
$searchTitle[] = ['title','like', "%$search%"];
}
echo Post::with(['allTags'])->whereHas('allTags', function($query) use ($searchArr) {
for ($i=0; $i < count($searchArr); $i++) {
if($i==0) {
$query->Where('name', $searchArr[$i]);
}else{
$query->orWhere('name', $searchArr[$i]);
}
}
})->where(['published'=>1])->orWhere([['title','like', "%$search%"],['published','=','1']])->get();
如你所见,我使用&#34; for&#34;循环检查多个标签,但我找不到如何在代码的这一部分->orWhere([['title','like', "%$search%"],['published','=','1']])->get();
有人可以告诉我该怎么做吗?
谢谢。
答案 0 :(得分:1)
据我了解,您需要使用.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-tab {
height: 90px;
margin: 0;
padding: 0;
width: 30px;
-ms-word-break: break-all;
word-break: break-all;
writing-mode: tb-rl;
}
方法。
小心这会导致SQL注入
whereRaw
您应该构建SQL,然后使用whereRaw方法使用基础PDO对象进行绑定:
foreach ($searchArr as $search) {
$searchTitle[] = ['title','like', "%$search%"];
}
然后在你的查询字符串中:
$searchQuery = implode(',', array_map(function($item) { return 'title like \"?\"'; }, $searchArray));
如果你真的在Post
上检查标题,那就更容易了...->whereHas('allTags', function($query) use ($searchQuery, $searchArray) {
$query->whereRaw($searchQuery, $searchArray, 'or');
})
另外请务必查看评论。
答案 1 :(得分:0)
根据我的理解,如果搜索字符串中的单词包含多个单词,您希望将其中断,如下例所示:
<?php
$search_term = 'test1 test2 test3';
$keywords = explode(" ", preg_replace("/\s+/", " ", $search_term));
foreach($keywords as $keyword){
$wherelike[] = "title LIKE '%$keyword%' ";
}
$where = implode(" and ", $wherelike);
$query = "select * from table where $where";
echo $query;
并使用Laravel whereRaw()
方法将其作为原始查询执行