sql >> データベース >  >> RDS >> Mysql

複数のキーワードを使用してデータベースから最も関連性の高いエントリを取得して注文する方法Laravel5

    たぶん、SQLマジシャンがあなたにもっと良いSQLソリューションを与えるかもしれません。しかしそれまでは...

    これが、Laravel コレクション で行う方法です。 (phpでソート):

    $search_terms = array('York', 'North Yorkshire');
    
    $properties = Property::where(function ($q) use ($search_terms) {
                foreach ($search_terms as $value) {
                    $q->orWhere('address1', 'like', "%{$value}%");
                    $q->orWhere('address2', 'like', "%{$value}%");
                    $q->orWhere('postcode', 'like', "%{$value}%");
                    $q->orWhere('city_town', 'like', "%{$value}%");
                    $q->orWhere('county', 'like', "%{$value}%");
                }
            })->paginate(25);
    
    $props = ['address1', 'address2', 'postcode', 'city_town', 'county'];
    
    $properties = $properties->sortByDesc(function($i, $k) use ($search_terms, $props) {
        // The bigger the weight, the higher the record
        $weight = 0;
        // Iterate through search terms
        foreach($search_terms as $searchTerm) {
            // Iterate through properties (address1, address2...)
            foreach($props as $prop) { 
                // Use strpos instead of %value% (cause php)
                if(strpos($i->{$prop}, $searchTerm) !== false)
                    $weight += 1; // Increase weight if the search term is found
            }
        }
    
        return $weight;
    });
    
    $properties = $properties->values()->all();
    


    1. MariaDB JSON_OBJECT()の説明

    2. MySQLからPDOへのコードの変更

    3. regex_substrの句で接続

    4. テーブルとしてのPostgres9.4jsonb配列