ChrisWillerton / Searchable by ChrisWillerton

Searchable trait for Laravel Eloquent models.
772
3
1
Package Data
Maintainer Username: ChrisWillerton
Package Create Date: 2016-07-06
Package Last Update: 2016-07-11
Language: PHP
License: MIT
Last Refreshed: 2024-11-11 15:13:44
Package Statistics
Total Downloads: 772
Monthly Downloads: 4
Daily Downloads: 1
Total Stars: 3
Total Watchers: 1
Total Forks: 1
Total Open Issues: 0

Searchable

Searchable trait for Laravel Eloquent models.

This trait uses a full text search to search individual models. A results collection is provided to help sort multiple model searches by relevance.

Installation

Add the following to the composer.json file in your project:

"chriswillerton/searchable": "1.*"

or you can run the below on the command line in the root of your project:

composer require "chriswillerton/searchable" "1.*"

Setup

To get started, add the trait to the model:

use ChrisWillerton\Searchable\Searchable;

class YourModel extends Eloquent
{
	use Searchable;

	protected $full_text_index = 'title, content';

You also need to define the full text index that you've setup in your database. Add this as a property on your model called $full_text_index.

Usage

You can use searchable as below:

$results = YourModel::search('search term')
	->orderBy('relevance', 'desc')
	->get();

The collection is used for collecting multiple model search results together and making it easy to sort the whole collection by relevance. Imagine you have an Article, Post, and Product class, but you want results from all of these mixed together and sorted by relevance. You could do something like the below:

// Set which models we wish to search
$models_to_search = [
	Article::class,
	Post::class,
	Product::class
];

$term = 'search term';
$model_results = [];

// Loop through each model and perform the search query
foreach ($models_to_search as $model)
{
	$model_results[] = $model::search($term)
		->get()
		->toArray();
}

// Merge each result set together into a single array of results
$merged_results = array_merge(...$model_results);

// Add these results to a collection...
$collection = new ChrisWillerton\Searchable\SearchableResults($merged_results);

// and order them by relevance
$results = $collection->getByRelevance();

You should consider the performance impact of doing the above though. It's probably best to come up with a specific search solution if maximising performance is required.