PHPackages                             japseyz/algoliasearch-laravel - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. japseyz/algoliasearch-laravel

AbandonedArchivedLibrary[API Development](/categories/api)

japseyz/algoliasearch-laravel
=============================

Laravel Algolia extension

1.0.14(9y ago)16MITPHPPHP &gt;=5.5.9

Since Jun 12Pushed 9y ago1 watchersCompare

[ Source](https://github.com/JapSeyz/algoliasearch-laravel)[ Packagist](https://packagist.org/packages/japseyz/algoliasearch-laravel)[ RSS](/packages/japseyz-algoliasearch-laravel/feed)WikiDiscussions master Synced 2mo ago

READMEChangelog (3)Dependencies (4)Versions (17)Used By (0)

Laravel Algolia Search
======================

[](#laravel-algolia-search)

This PHP package integrates the Algolia Search API to the Laravel Eloquent ORM. It's based on the [algoliasearch-client-php](https://github.com/algolia/algoliasearch-client-php) package. PHP 5.5.9+ is supported.

[![Build Status](https://camo.githubusercontent.com/143cef03e4e7f86270030a3800a69e034fa0ef3b5b75b115eedd0c9792654c91/68747470733a2f2f696d672e736869656c64732e696f2f7472617669732f616c676f6c69612f616c676f6c69617365617263682d6c61726176656c2f6d61737465722e7376673f7374796c653d666c6174)](https://travis-ci.org/algolia/algoliasearch-laravel)[![Latest Version](https://camo.githubusercontent.com/078ad849ac37abd69b6ac631e0c57a1f4df1b82422d5a5734f986774177eb860/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f616c676f6c69612f616c676f6c69617365617263682d6c61726176656c2e7376673f7374796c653d666c6174)](https://github.com/algolia/algoliasearch-laravel/releases)[![License](https://camo.githubusercontent.com/3de5ae6d37c1b4691e8aa672b9a5b2a788be6d66e185425ac0ae12eb1975139a/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f616c676f6c69612f616c676f6c69617365617263682d6c61726176656c2e7376673f7374796c653d666c6174)](https://packagist.org/packages/algolia/algoliasearch-laravel)

**Note:** If you're using Laravel 4, checkout the [algoliasearch-laravel-4](https://github.com/algolia/algoliasearch-laravel-4) repository.

Table of Content
----------------

[](#table-of-content)

1. [Install](#install)
2. [Configuration](#configuration)
3. [Quick Start](#quick-start)
4. [Ranking &amp; Relevance](#ranking--relevance)
5. [Options](#options)
6. [Indexing](#indexing)
7. [Master/Slave](#masterslave)
8. [Target multiple indexes](#target-multiple-indexes)

Install
=======

[](#install)

Add `algolia/algoliasearch-laravel` to your `composer.json` file:

```
composer require algolia/algoliasearch-laravel
```

Add the service provider to `config/app.php` in the `providers` array.

```
AlgoliaSearch\Laravel\AlgoliaServiceProvider::class
```

Configuration
=============

[](#configuration)

Laravel Algolia requires a connection configuration. To get started, you'll need to publish all vendor assets:

```
php artisan vendor:publish
```

You can add the `--provider="Vinkla\Algolia\AlgoliaServiceProvider"` option to only publish assets of the Algolia package.

This will create a `config/algolia.php` file in your app that you can modify to set your configuration. Also, make sure you check for changes compared to the original config file after an upgrade.

Quick Start
===========

[](#quick-start)

The following code adds search capabilities to your `Contact` model creating a `Contact` index:

```
use Illuminate\Database\Eloquent\Model;
use AlgoliaSearch\Laravel\AlgoliaEloquentTrait;

class Contact extends Model
{
    use AlgoliaEloquentTrait;
}
```

By default all visible attributes are sent. If you want to send specific attributes you can do something like:

```
use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
    use AlgoliaEloquentTrait;

    public function getAlgoliaRecord()
    {
        return array_merge($this->toArray(), [
            'custom_name' => 'Custom Name'
        ]);
    }
}
```

Ranking &amp; Relevance
-----------------------

[](#ranking--relevance)

We provide many ways to configure your index settings to tune the overall relevancy but the most important ones are the **searchable attributes** and the attributes reflecting the **record popularity**. You can configure them with the following code:

```
use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
    use AlgoliaEloquentTrait;

    public $algoliaSettings = [
    	'attributesToIndex' => [
    		'id',
    		'name',
    	],
    	'customRanking' => [
    		'desc(popularity)',
    		'asc(name)',
    	],
    ];
}
```

You can propagate (save) the settings to algolia using the `setSetting` method:

```
Contact::setSettings();
```

Frontend Search (realtime experience)
-------------------------------------

[](#frontend-search-realtime-experience)

Traditional search implementations tend to have search logic and functionality on the backend. This made sense when the search experience consisted of a user entering a search query, executing that search, and then being redirected to a search result page.

Implementing search on the backend is no longer necessary. In fact, in most cases it is harmful to performance because of the extra network and processing latency. We highly recommend the usage of our [JavaScript API Client](https://github.com/algolia/algoliasearch-client-js) issuing all search requests directly from the end user's browser, mobile device, or client. It will reduce the overall search latency while offloading your servers at the same time.

In your JavaScript code you can do:

```
var client = algoliasearch('ApplicationID', 'Search-Only-API-Key');
var index = client.initIndex('YourIndexName');
index.search('something', function(success, hits) {
  console.log(success, hits)
}, { hitsPerPage: 10, page: 0 });
```

Backend Search
--------------

[](#backend-search)

You could also use the `search` method but it's not recommended to implement instant/realtime search experience:

```
Contact::search('jon doe');
```

Options
=======

[](#options)

Auto-indexing &amp; Asynchronism
--------------------------------

[](#auto-indexing--asynchronism)

Each time a record is saved; it will be - asynchronously - indexed. On the other hand, each time a record is destroyed, it will be - asynchronously - removed from the index.

You can disable the auto-indexing and auto-removing setting the following options:

```
use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
	use AlgoliaEloquentTrait;

	public static $autoIndex = false;
	public static $autoDelete = false;
}
```

You can temporary disable auto-indexing. This is often used for performance reason.

```
Contact::$autoIndex = false;
Contact::clearIndices();

for ($i = 0; $i < 10000; $i++) {
	$contact = Contact::firstOrCreate(['name' => 'Jean']);
}

Contact::reindex(); // Will use batch operations.
```

Custom Index Name
-----------------

[](#custom-index-name)

By default, the index name will be the pluralized class name, e.g. "Contacts". You can customize the index name by using the `$indices` option:

```
use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
    use AlgoliaEloquentTrait;

    public $indices = ['contact_all'];
}
```

Per-environment Indexes
-----------------------

[](#per-environment-indexes)

You can suffix the index name with the current App environment using the following option:

```
use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
    use AlgoliaEloquentTrait;

    public static $perEnvironment = true; // Index name will be 'Contacts_{\App::environnement()}';
}
```

Custom `objectID`
-----------------

[](#custom-objectid)

By default, the `objectID` is based on your record's `keyName` (`id` by default). You can change this behavior specifying the `objectIdKey` option (be sure to use a uniq field).

```
use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
    use AlgoliaEloquentTrait;

	public static $objectIdKey = 'new_key';
}
```

Restrict Indexing to a Subset of Your Data
------------------------------------------

[](#restrict-indexing-to-a-subset-of-your-data)

You can add constraints controlling if a record must be indexed by defining the `indexOnly()` method.

```
use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
   	use AlgoliaEloquentTrait;

	public function indexOnly($index_name)
	{
		return (bool) $condition;
	}
}
```

Relationships
=============

[](#relationships)

By default the Algolia package will fetch the **loaded** relationships.

If you want to index records that didn't yet load any relations you can do it by loading them in the `getAlgoliaRecord` that you can create in your model.

It will look like:

```
public function getAlgoliaRecord()
{
	/**
	 * Load the categories relation so that it's available
	 * 	in the laravel toArray method
	 */
	$this->categories;

   return $this->toArray();
}
```

In the resulted object you will have categories converted to array by Laravel. If you want a custom relation structure you will instead do something like :

```
public function getAlgoliaRecord()
{
	/**
	 * Load the categories relation so that it's available
	 * 	in the laravel toArray method
	 */
	$extra_data = [];
	$extra_data['categories'] = array_map(function ($data) {
							            return $data['name'];
						        }, $this->categories->toArray();

   return array_merge($this->toArray(), $extra_data);
}
```

Indexing
========

[](#indexing)

Manual Indexing
---------------

[](#manual-indexing)

You can trigger indexing using the `pushToIndex` instance method.

```
$contact = Contact::firstOrCreate(['name' => 'Jean']);
$contact->pushToIndex();
```

Manual Removal
--------------

[](#manual-removal)

And trigger the removing using the `removeFromIndex` instance method.

```
$contact = Contact::firstOrCreate(['name' => 'Jean']);
$contact->removeFromIndex();
```

Reindexing
----------

[](#reindexing)

To *safely* reindex all your records (index to a temporary index + move the temporary index to the current one atomically), use the `reindex` class method:

```
Contact::reindex();
```

To reindex all your records (in place, without deleting out-dated records):

```
Contact::reindex(false);
```

Clearing an Index
-----------------

[](#clearing-an-index)

To clear an index, use the `clearIndices` class method:

```
Contact::clearIndices();
```

Master/Slave
============

[](#masterslave)

You can define slave indexes using the `$algolia_settings` variable:

```
use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
	 use AlgoliaEloquentTrait;

	 public $algoliaSettings = [
		'attributesToIndex' => [
			'id',
			'name',
		],
    	'customRanking' => [
    		'desc(popularity)',
    		'asc(name)',
    	],
    	'slaves' => [
    		'contacts_desc',
    	],
    ];

    public $slavesSettings = [
        'contacts_desc' => [
            'ranking' => [
                'desc(name)',
                'typo',
                'geo',
                'words',
                'proximity',
                'attribute',
                'exact',
                'custom'
            ]
        ]
    ];
}
```

To search using a slave use the following code:

```
Book::search('foo bar', ['index' => 'contacts_desc']);
```

Target Multiple Indexes
=======================

[](#target-multiple-indexes)

You can index a record in several indexes using the `$indices` property:

```
use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
	use AlgoliaEloquentTrait;

	public $indices = [
		'contact_public',
		'contact_private',
	];

	public function indexOnly($indexName)
	{
		if ($indexName == 'contact_public')
			return true;

		return $this->private;
	}

}
```

To search using an extra index, use the following code:

```
Book::search('foo bar', ['index' => 'contacts_private']);
```

Eloquent compatibility
======================

[](#eloquent-compatibility)

Doing :

```
Ad::where('id', $id)->update($attributes);

```

will not trigger anything in the model (so no update will happen in Algolia). This is because this is not an Eloquent call, it is just a convenient way to generate the query hidden behind the model

To make this query work with Algolia you need to do it like that:

```
Ad::find($id)->update($attributes);

```

Compatibility
=============

[](#compatibility)

Compatible with 5.x applications

License
-------

[](#license)

Laravel Algolia Search is licensed under [The MIT License (MIT)](LICENSE).

###  Health Score

29

—

LowBetter than 60% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity6

Limited adoption so far

Community16

Small or concentrated contributor base

Maturity66

Established project with proven stability

 Bus Factor1

Top contributor holds 65.4% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~25 days

Recently: every ~34 days

Total

16

Last Release

3608d ago

Major Versions

1.0.4 → 4.2.x-dev2015-09-28

PHP version history (2 changes)1.0.0PHP &gt;=5.5.9

4.2.x-devPHP &gt;=5.3.29

### Community

Maintainers

![](https://www.gravatar.com/avatar/33ad5acc22761cefe15f2c62d8d7d1f22b1faea6bd118f8dbc71ee753ff32b92?d=identicon)[JapSeyz](/maintainers/JapSeyz)

---

Top Contributors

[![maxiloc](https://avatars.githubusercontent.com/u/1689007?v=4)](https://github.com/maxiloc "maxiloc (68 commits)")[![vinkla](https://avatars.githubusercontent.com/u/499192?v=4)](https://github.com/vinkla "vinkla (18 commits)")[![JapSeyz](https://avatars.githubusercontent.com/u/2234034?v=4)](https://github.com/JapSeyz "JapSeyz (5 commits)")[![redox](https://avatars.githubusercontent.com/u/29529?v=4)](https://github.com/redox "redox (3 commits)")[![nikita240](https://avatars.githubusercontent.com/u/6479817?v=4)](https://github.com/nikita240 "nikita240 (3 commits)")[![harrisbp](https://avatars.githubusercontent.com/u/10454950?v=4)](https://github.com/harrisbp "harrisbp (2 commits)")[![seafoox](https://avatars.githubusercontent.com/u/1101220?v=4)](https://github.com/seafoox "seafoox (1 commits)")[![ghostprofile](https://avatars.githubusercontent.com/u/41087149?v=4)](https://github.com/ghostprofile "ghostprofile (1 commits)")[![code-poel](https://avatars.githubusercontent.com/u/525901?v=4)](https://github.com/code-poel "code-poel (1 commits)")[![5outh](https://avatars.githubusercontent.com/u/959901?v=4)](https://github.com/5outh "5outh (1 commits)")[![freekmurze](https://avatars.githubusercontent.com/u/483853?v=4)](https://github.com/freekmurze "freekmurze (1 commits)")

---

Tags

apisearchlaravelalgolia

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/japseyz-algoliasearch-laravel/health.svg)

```
[![Health](https://phpackages.com/badges/japseyz-algoliasearch-laravel/health.svg)](https://phpackages.com/packages/japseyz-algoliasearch-laravel)
```

###  Alternatives

[algolia/algoliasearch-client-php

API powering the features of Algolia.

69333.0M114](/packages/algolia-algoliasearch-client-php)[aerni/laravel-spotify

A Laravel wrapper for the Spotify Web API

209145.6k](/packages/aerni-laravel-spotify)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
