0

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;
}

ユーザーが部分的な単語やフレーズを使用してフィールドを検索できるように、上記のコードを変更してください。たとえば、ユーザーが紫と入力した場合、単語紫を含む電子メール アドレス (info@purplegriffon.com) を持つレコードも検索で見つけたいと思います。したがって、本質的に部分一致です。

また、入力されたフレーズ john griffon のフィールドで griffon を含むすべてのものを検索できるようにしたいと考えています。たとえ john が存在しなくてもです。

誰でもこれで私を助けることができますか? 乾杯。

4

2 に答える 2

0

私は解決策を得ました:

$terms = mysql_real_escape_string($terms);

$contact_results = Contact::where_account_user_id(Auth::user()->account_user_id)

->raw_where("match (`first`, `last`) against ('{$terms}*' IN BOOLEAN MODE)")

->where_deleted(0)

->paginate(20);
phpconsole($contact_results->results);

return $contact_results;
于 2013-12-08T09:16:10.387 に答える
0

OK、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;
}

誰かがこれを簡素化または改善できる場合は、ぜひご覧ください。乾杯。

于 2013-08-01T14:54:53.240 に答える