我有以下代码,可以在Laravel 4中的模型中搜索搜索词组。它使用'IN BOOLEAN MODE'和MATCH()和AGAINST()。
public function scopeSearch($query, $q)
{
$fields = Static::getFields();
$fields = implode(', ', $fields);
$query->whereRaw("MATCH(" . $fields . ") AGAINST('" . $q . "' IN BOOLEAN MODE)");
}
public static function getFields()
{
$field_names = array();
$disallowed = array('id', 'created_at', 'updated_at', 'deleted_at');
$columns = DB::select('SHOW COLUMNS FROM accounts');
foreach ($columns as $c) {
$field = $c->Field;
if ( ! in_array($field, $disallowed)) {
$field_names[$field] = $field;
}
}
return $field_names;
}
我想要帮助修改上面的代码,以允许用户使用部分单词和短语来搜索字段。例如,如果用户键入Purple,我希望搜索还查找包含电子邮件地址包含单词Purple的任何记录,因此为[email protected]。因此,本质上是部分匹配。
我还希望能够在字段中为键入的短语john griffon找到所有包含griffon的内容,即使john不存在也是如此。
谁能帮我这个忙吗?干杯。
最佳答案
好的,通过FULLTEXT搜索并使用通配符运算符搜索部分,可以使其发挥最大的作用。这可能不是最佳解决方案,但它可以工作。
public function scopeSearch($query, $q)
{
$fields = Static::getFields();
$fields = implode(', ', $fields);
$terms = explode(' ', $q);
if (count($terms) > 1) {
$query->whereRaw("MATCH(" . $fields . ") AGAINST ('" . $q . "' IN BOOLEAN MODE)");
} else {
foreach ($terms as $term) {
$query->whereRaw("MATCH(" . $fields . ") AGAINST ('*" . $term . "*' IN BOOLEAN MODE)");
}
}
}
public static function getFields()
{
$field_names = array();
$disallowed = array('id', 'country_id', 'created_at', 'updated_at', 'deleted_at');
$columns = DB::select('SHOW COLUMNS FROM venues');
foreach ($columns as $c) {
$field = $c->Field;
if ( ! in_array($field, $disallowed)) {
$field_names[$field] = $field;
}
}
return $field_names;
}
如果有人可以简化或改进它,那么我很乐意看到它。干杯。