我正在使用 Laravel 5.5 &的 MySQL的即可。我想使用全文搜索电子邮件,但我一直收到此错误:
语法错误或访问冲突:1064语法错误,意外'@', 期待$ end(SQL:select * from
users
where MATCH(users.email) 反对(+用户@ * IN BOOLEAN模式)或MATCH(users.username)反对 (+ user @ * IN BOOLEAN MODE))
这就是我查询的方式
$keyword = $request->keyword;
$exp = explode(' ', $keyword);
$s = '';
$c = 1;
foreach ($exp AS $e)
{
$s .= "+$e*";
if ($c + 1 == count($exp))
$s .= ' ';
$c++;
}
$users = User::whereRaw("MATCH (users.email) AGAINST (? IN BOOLEAN MODE)", [$s])
->orWhereRaw("MATCH (users.username) AGAINST (? IN BOOLEAN MODE)", [$s])
->get();
我已经尝试更改要转义的where子句并添加引号,但它不起作用
::whereRaw('"MATCH (users.email) AGAINST (? IN BOOLEAN MODE)"', [$s])
->orWhereRaw('"MATCH (users.username) AGAINST (? IN BOOLEAN MODE)"', [$s])
::whereRaw("MATCH (users.email) AGAINST (? IN BOOLEAN MODE)", ["$s"])
->orWhereRaw("MATCH (users.username) AGAINST (? IN BOOLEAN MODE)", ["$s"])
::whereRaw('MATCH (users.email) AGAINST ("?" IN BOOLEAN MODE)', [$s])
->orWhereRaw('MATCH (users.username) AGAINST ("?" IN BOOLEAN MODE)', [$s])
答案 0 :(得分:1)
这是MySQL的限制。 From the documentation:
InnoDB
全文搜索不支持在布尔全文搜索中使用@
符号。@
符号保留供@distance
邻近搜索运算符使用。
此问题已打开bug report,但已通过文档更新关闭。这让我相信他们不认为这是一个错误,这不会很快改变。
您可以尝试将表格更改为MyISAM引擎。这并不理想,根据上面提到的错误报告,仍然可能无法解决问题。
除非您在字段中填充多个电子邮件或用户名,否则我认为您可以使用varchars,普通索引和LIKE
查询。由于您似乎只是从字符串的开头搜索(例如email LIKE 'user@%'
),因此将使用正常索引。当您需要将通配符放在字符串的开头时,会遇到麻烦。