nahid-ferdous/laravel-searchable

Laravel 包,用于缩短 Eloquent 查询。

1.4.0 2024-05-17 17:53 UTC

This package is auto-updated.

Last update: 2024-09-17 18:40:16 UTC


README

安装

您可以通过 composer 安装此包

composer require nahid-ferdous/laravel-searchable

用法

在模型中导入

# Example Model:
use NahidFerdous\Searchable\Searchable;

class User extends Authenticatable
{
    use Searchable;
    
    public function country()
    {
        return $this->belongsTo(Country::class);
    }
    
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

发布配置文件

php artisan vendor:publish --provider="NahidFerdous\Searchable\SearchableServiceProvider"

// 例如搜索 URL http://example.com/users?search_query=searchTerm&status=1&date=2020-01-01&date_range=2020-01-01%20-%202020-01-31

单个模型的示例:

# Usage:
$searchQuery = request('search_query');
$users = User::search($searchQuery, ['%name', '%email', 'phone'])->get();

# Output:
User::where('name', 'like', '%'.$searchQuery.'%')
    ->orWhere('email', 'like', '%'.$searchQuery.'%')
    ->orWhere('phone', $searchQuery)
    ->get();

具有关系的示例:

# Usage: 
$searchQuery = request('search_query'); // e.g. 'bangladesh'
$users = User::search($searchQuery, [
        '%name',
        '%email',
        '%phone',
        'country|%name',
        'country.city|%$name'
    ])->get();

# Output:
User::where('name', 'like', '%'.$searchQuery.'%')
    ->orWhere('email', 'like', '%'.$searchQuery.'%')
    ->orWhere('phone', 'like', '%'.$searchQuery.'%')
    ->orWhereHas('country', function ($query) use ($searchQuery) {
        $query->where('name', 'like', '%'.$searchQuery.'%');
    })
    ->orWhereHas('country.city', function ($query) use ($searchQuery) {
        $query->where('name', 'like', '%'.$searchQuery.'%');
    })
    ->get();

搜索连接列的示例:

# Usage:
$searchQuery = request('search_query');
$users = User::search($searchQuery, [
        '%first_name',
        '%last_name',
        '%first_name+last_name',
    ])->get();


# Output:
User::where('first_name', 'like', '%'.$searchQuery.'%')
    ->orWhere('last_name', 'like', '%'.$searchQuery.'%')
    ->orWhere(DB::raw("concat(first_name, ' ', last_name)"), 'LIKE', "%" . $searchQuery . "%");
    ->get();

搜索多个条件的示例:

# Usage:
$searchQuery = request('search_query');
$status = request('status');
$users = User::search($searchQuery, [
        '%first_name',
        '%last_name',
        '%first_name+last_name',
    ])
    ->search(request('status'), ['status'])
    ->get();


# Output:
User::where('first_name', 'like', '%'.$searchQuery.'%')
    ->orWhere('last_name', 'like', '%'.$searchQuery.'%')
    ->orWhere(DB::raw("concat(first_name, ' ', last_name)"), 'LIKE', "%" . $searchQuery . "%")
    ->where('status', $status)
    ->get();

日期搜索示例:

# Usage:
$status = request('status');
$date = request('date'); // e.g. 2020-01-01 
$users = User::search($status, ['status'])
    ->searchDate($date, ['created_at'], '>');
    ->get();

# Output:
User::where('status', $status)
    ->whereDate('created_at', '>', $date)
    ->get();

日期范围搜索示例:

# Usage:
$status = request('status');
$dateRange = request('date_range'); // e.g. 2020-01-01 - 2020-01-31 // Must be separated by space and -
$users = User::search($status, ['status'])
    ->searchDate($dateRange, ['created_at'], '><');
    ->get();

# Output:
$startDate = explode(' - ', $dateRange)[0];
$endDate = explode(' - ', $dateRange)[1];
$start = Carbon::parse($startDate);
$end = Carbon::parse($endDate);
User::where('status', $status)
     ->whereBetween($relationAttribute, [$start, $end]);
    ->get();

具有关系的日期搜索示例:

### Coming Soon

具有关系的日期范围搜索示例:

### Coming Soon