文字列でサクッと検索!Laravel Search String

文字列でサクッと検索!Laravel Search String

どうもこんにちは塚本です!

最近はとても暖かくなってきて,
やっと釣りに行けるなという感じです.

今日はシンプルな文字列を強力なクエリビルダに変えてくれる
Laravel Search Stringをご紹介いたします.

Laravel Search String

Laravel Search Stringは,その名の通りに
文字列に基づいてデータベースクエリを生成してくれます.

'John' or age > 30 sort:-created_at limit:4

こちらがプロジェクトのREADMEから引用した参考画像です.
上記の文字列から,参考画像のようなデータが取得できていることが分かると思います.

Installation

# Install via composer
$ composer require lorisleiva/laravel-search-string

# (Optional) Publish the search-string.php configuration file
$ php artisan vendor:publish --tag=search-string

Prepare

モデルに SearchString trait を追加し,検索文字列で使用する列を設定します.

use Lorisleiva\LaravelSearchString\Concerns\SearchString;

class Article extends Model
{
    use SearchString;

    protected $searchStringColumns = [
        'title', 'body', 'status', 'rating', 'published', 'created_at',
    ];
}

これで準備OKです!

Usage

例:ブログ記事のフェッチ

// Use `Laravel Search String`
Article::usingSearchString('title:"My blog article" or not published sort:-created_at');

// Equivalent to:
Article::where('title', 'My blog article')
       ->orWhere('published', false)
       ->orderBy('created_at', 'desc');

ブログタイトルがMy blog articleで,
まだ公開されていない最新記事を取ってくるクエリになります.

純正の書き方だと,下側の書き方になります.

whereInも使用可能

// Use `Laravel Search String`
Invoice::usingSearchString('John and status in (Paid,Archived) limit:10 from:10');

// Equivalent to:
Invoice::where(function ($query) {
           $query->where('customer', 'like', '%John%')
               ->orWhere('description', 'like', '%John%');
       })
       ->whereIn('status', ['Paid', 'Archived'])
       ->limit(10)
       ->offset(10);

上記例のように,whereInも使用可能です.
また,単にJohn and ~とすることによって,Johnが含まれているかどうかも検索可能です.

日付関連

個人的に便利だなと思ったのは日付関連のクエリです.

// Year precision
'created_at >= 2020'                    // 2020-01-01 00:00:00 <= created_at
'created_at > 2020'                     // 2020-12-31 23:59:59 < created_at
'created_at = 2020'                     // 2020-01-01 00:00:00 <= created_at <= 2020-12-31 23:59:59
'not created_at = 2020'                 // created_at < 2020-01-01 00:00:00 and created_at > 2020-12-31 23:59:59

// Month precision
'created_at = 01/2020'                  // 2020-01-01 00:00:00 <= created_at <= 2020-01-31 23:59:59
'created_at <= "Jan 2020"'              // created_at <= 2020-01-31 23:59:59
'created_at < 2020-1'                   // created_at < 2020-01-01 00:00:00

// Day precision
'created_at = 2020-12-31'               // 2020-12-31 00:00:00 <= created_at <= 2020-12-31 23:59:59
'created_at >= 12/31/2020"'             // 2020-12-31 23:59:59 <= created_at
'created_at > "Dec 31 2020"'            // 2020-12-31 23:59:59 < created_at

// Hour and minute precisions
'created_at = "2020-12-31 16"'          // 2020-12-31 16:00:00 <= created_at <= 2020-12-31 16:59:59
'created_at = "2020-12-31 16:30"'       // 2020-12-31 16:30:00 <= created_at <= 2020-12-31 16:30:59
'created_at = "Dec 31 2020 5pm"'        // 2020-12-31 17:00:00 <= created_at <= 2020-12-31 17:59:59
'created_at = "Dec 31 2020 5:15pm"'     // 2020-12-31 17:15:00 <= created_at <= 2020-12-31 17:15:59

// Exact precision
'created_at = "2020-12-31 16:30:00"'    // created_at = 2020-12-31 16:30:00
'created_at = "Dec 31 2020 5:15:10pm"'  // created_at = 2020-12-31 17:15:10

// Relative dates
'created_at = today'                    // today between 00:00 and 23:59
'not created_at = today'                // any time before today 00:00 and after today 23:59
'created_at >= tomorrow'                // from tomorrow at 00:00
'created_at <= tomorrow'                // until tomorrow at 23:59
'created_at > tomorrow'                 // from the day after tomorrow at 00:00
'created_at < tomorrow'                 // until today at 23:59

設定できるものは,他にもたくさんあるので
気になった方はGitHubをご覧ください.