Laravel Nova icon Nova Packages
S

Search Relations

Installation Instructions

composer require titasgailius/search-relations

Next, add Titasgailius\SearchRelations\SearchesRelations trait to your base resource class App\Nova\Resource

use Titasgailius\SearchRelations\SearchesRelations;

abstract class Resource extends NovaResource
{
    use SearchesRelations;

Usage

Simply add public static $searchRelations array to any of your Nova resources. This array has a relationship name as a key and an array of columns to search for as a value.

/**
 * The relationship columns that should be searched.
 *
 * @var array
 */
public static $searchRelations = [
    'user' => ['username', 'email'],
];

Readme

I stand with Ukraine πŸ‡ΊπŸ‡¦

Search relationships in Laravel Nova

This package allows you to include relationship columns into Laravel Nova search query.

Screenshot

screenshot of the search relations tool

Installation

composer require titasgailius/search-relations

Next, add Titasgailius\SearchRelations\SearchesRelations trait to your base resource class App\Nova\Resource

use Titasgailius\SearchRelations\SearchesRelations;

abstract class Resource extends NovaResource
{
    use SearchesRelations;

Usage

Simply add public static $searchRelations variable to any of your Nova resources. This array accepts a relationship name as a key and an array of searchable columns as a value.

/**
 * The relationship columns that should be searched.
 *
 * @var array
 */
public static $searchRelations = [
    'user' => ['username', 'email'],
];

Alternatively, you may add a static searchableRelations() method to return an array of searchable relations.

/**
 * Get the searchable columns for the resource.
 *
 * @return array
 */
public static function searchableRelations(): array
{
    return [
        'user' => ['username', 'email'],
    ];
}

Global search

You may customize the rules of your searchable relationships for global search by defining the $globalSearchRelations property.

/**
 * The relationship columns that should be searched globally.
 *
 * @var array
 */
public static $globalSearchRelations = [
    'user' => ['email'],
];

Alternatively, you may add a static globallySearchableRelations() method to return an array of globally searchable relations.

/**
 * Get the searchable columns for the resource.
 *
 * @return array
 */
public static function globallySearchableRelations(): array
{
    return [
        'user' => ['email'],
    ];
}

Disabling global search for relationships

You may disable the global relationship search by declaring $globalSearchRelations with an empty array.

/**
 * The relationship columns that should be searched globally.
 *
 * @var array
 */
public static $globalSearchRelations = [];

Alternatevily, you may disable the global search for relationships by setting the $searchRelationsGlobally property to false.

/**
 * Determine if relations should be searched globally.
 *
 * @var array
 */
public static $searchRelationsGlobally = false;

Nested relationships

You may search nested relationships using dot notation.

/**
 * The relationship columns that should be searched.
 *
 * @var array
 */
public static $searchRelations = [
    'user.country' => ['code'],
];

Extending Search

You may apply custom search logic for the specified relations by retuning a class implementing a Search interface.

/**
 * Get the searchable columns for the resource.
 *
 * @return array
 */
public static function searchableRelations(): array
{
    return [
        'country' => new LocationSearch(['USA', 'UK']),
    ];
}

Your custom search class must implement a simple Search interface that has a single method which accepts the current query $query, a relationship name $relation and a search input $search.

<?php

namespace Titasgailius\SearchRelations\Contracts;

use Illuminate\Database\Eloquent\Builder;

interface Search
{
    /**
     * Apply search for the given relation.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @param  string  $relation
     * @param  string  $search
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function apply(Builder $query, string $relation, string $search): Builder;
}

You may take a look at the Titasgailius\SearchRelations\Searches\RelationSearch class as an example.

Reviews

Rated 5 stars out of 5

By Bryan Ingram on July 3, 2021

Was easy to install, simple to configure, and just worked. Vastly improved the usability of the search feature for models with relations.

Rated 5 stars out of 5

By Mateus Galasso on May 20, 2021

Awesome Package

Back to Top
Added 6 years ago
Last updated 4 Years Ago
Version 2.0.1
Composer
titasgailius/search-relations
GitHub stars 361
Packagist downloads 6,418,585

Favorites

73 users favorited

Rating

4.90
(out of 5)
β˜…β˜…β˜…β˜…β˜…
β˜…β˜…β˜…β˜…
β˜…β˜…β˜…
β˜…β˜…
β˜…
42 ratings

Tags

Brought to you by Tighten

Issues/Feature Requests Stats Package Ideas