请记住,我的SQL经验很少,所以我可能做错了。
我正在尝试设置搜索表,但简单地搜索用户输入的字符串并不理想,因为尽管可能会出现"steve",但如果用户键入"steve jobs story",如果不存在,则没有匹配的内容,因为它将搜索整个字符串,而不是分别查找每个单词。
我试图通过将字符串分解成一个数组,然后将其内爆并用%'s将其分离来将其分解,所以像"steve jobs story"这样的搜索将是"steve%jobs%story",而我的查询将是"%steve%jobs%story%"。当我尝试搜索这个时,我没有得到任何错误,但查询一无所获,而当我只键入一个单词时,它就起作用了,所以我猜我试图做的是不允许的。
有人能给我指正确的方向吗?这是我的控制器/型号:
// Controller
$query = $request->get('q');
$explodedQuery = explode(" ", $query);
$newQuery = implode("%", $explodedQuery);
$articles = Article::isLikeTitle($newQuery)
->isLikeBody($newQuery)
->latest('published_at')
->published()
->paginate(10);
// Model
public function scopeIsLikeTitle($query, $q)
{
return $query->where('title', 'LIKE', "%$q%");
}
public function scopeIsLikeBody($query, $q)
{
return $query->where('body', 'LIKE', "%$q%");
}
您可以使用循环将查询附加为orWhere,类似于此
$query = $request->get('q');
$explodedQuery = explode(" ", $query);
$articles = Article::isLikeTitle($explodedQuery)
->isLikeBody($explodedQuery)
->latest('published_at')
->published()
->paginate(10);
// Model
public function scopeIsLikeTitle($query, $q)
{
foreach($q as $eachQueryString)
{
$query->orWhere('title', 'LIKE', '%'.$eachQueryString .'%');
}
return $query;
}
public function scopeIsLikeBody($query, $q)
{
foreach($q as $eachQueryString)
{
$query->orWhere('body', 'LIKE', '%'.$eachQueryString .'%');
}
return $query;
}