3

GitHub - h-farm/laravel-searchable: Easily add weighted searches through model a...

 2 years ago
source link: https://github.com/h-farm/laravel-searchable
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Laravel Searchable mag

Easily add weighted searches through model attributes and relationships.

This package currently supports MySQL and PostgreSQL.

Installation

You can install the package via composer:

composer require h-farm/laravel-searchable

You can publish the config file with:

php artisan vendor:publish --provider="HFarm\Searchable\SearchableServiceProvider" --tag="searchable-config"

This is the content of the published config file:

return [
    /*
    |--------------------------------------------------------------------------
    | Default match weight
    |--------------------------------------------------------------------------
    |
    | The weight of all searched words which match at least one of the
    | list of searchable attributes.
    | Defaults to 1.
    |
    */

    'default_match_weight' => 1,
];

Usage

To use the package, add the HFarm\Searchable\HasSearch trait to each model you want to make searchable.

Once done, you can implement the getSearchableAttributes abstract method by returning the list of attributes (or relationships' attributes) you want to search for.

You can also define the weight of each searchable attribute. If no weight is specified then default_match_weight will be taken from config/searchable.php.

Here's an example model including the HasSearch trait:

<?php

namespace App\Models;

use HFarm\Searchable\HasSearch;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Support\Facades\DB;

class Article extends Model
{
    use HasSearch;

    protected $fillable = [
        'id',
        'title',
        'body',
        'creator_name',
        'creator_surname',
    ];

    protected $casts = [
        'body' => 'array',
    ];

    /**
     * Get the model's searchable attributes.
     *
     * @return array
     */
    public function getSearchableAttributes(): array
    {
        return [
            'title' => 5, // Model attribute
            'body.en' => 2, // Single json key of a model attribute
            'tags.name', // Relationship attribute
            'tags.description.*', // All json keys of a relationship attribute
            DB::raw("CONCAT(creator_name, ' ', creator_surname)"), // Raw expressions are supported too
        ];
    }

    /**
     * Allows fetching the tags bound to current article instance
     *
     * @return BelongsToMany
     */
     public function tags(): BelongsToMany
     {
        return $this->belongsToMany(Tag::class)->withTimestamps();
     }
}

Now you can just search for a given term using the scopeSearch scope method:

use App\Models\Article;

$searchTerm = 'the search string';

Article::query()
    ->search($searchTerm)
    ->where('column', '=', 'something')
    ->get();

That's all!

The package generates an SQL query with an 'or' condition for each search term and each searchable fields. The given query returns all models matching the search terms. Furthermore, search results are weighted, which means the query will be ordered by the most matching models.

If you don't want to order the search results by its match weight, you can set the orderByWeight flag to false:

use App\Models\Article;

$searchTerm = 'the search string';

Article::query()
    ->search($searchTerm, false)
    ->where('column', '=', 'something')
    ->get();

Testing

composer test

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

Credits

License

The MIT License (MIT). Please see License File for more information.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK