1. Go to this page and download the library: Download bytetcore/serpo library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
bytetcore / serpo example snippets
namespace App\Repositories;
use App\Models\User;
use ByteTCore\Serpo\Repositories\BaseRepository;
class UserRepository extends BaseRepository
{
public function __construct(User $model)
{
parent::__construct($model);
}
}
$repo = app(UserRepository::class);
// Get all records
$users = $repo->all();
// Get with specific columns
$users = $repo->get(['id', 'name', 'email']);
// Get first record
$user = $repo->first();
// Get first or throw exception
$user = $repo->firstOrFail();
// Get latest record
$user = $repo->last();
$user = $repo->last('updated_at');
use ByteTCore\Serpo\Criteria\Condition;
use App\Criteria\ActiveUserCriteria;
class UserRepository extends BaseRepository
{
protected function conditions(): array
{
return [
'status' => Condition::where(),
'keyword' => Condition::like('name', 'email')->or(),
'min_age' => Condition::where('age')->gte(),
'created_from' => Condition::date('created_at')->gte(),
'price_between' => Condition::between('price'),
'tags' => Condition::whereIn('tags'),
'deleted' => Condition::whereNull('deleted_at'),
'birth_year' => Condition::year('birth_date'),
'active' => Condition::custom(ActiveUserCriteria::class),
'search' => Condition::orGroup(
Condition::like('name'),
Condition::where('email'),
),
];
}
public function __construct(User $model)
{
parent::__construct($model);
}
}
// In your controller
$users = $repo->filters($request->only(['status', 'keyword', 'min_age']))->get();
protected function filterOrder(): array
{
return [
'keyword', // applied first
'status', // applied second
];
// 'min_age', 'created_from', ... — any keys not listed are appended in original order
}
'status' => Condition::where(), // WHERE status = input
'price_over' => Condition::where('price')->gte(), // WHERE price >= input
'not_admin' => Condition::where('role')->not(), // WHERE role != input
'keyword' => Condition::like('title', 'content', 'author')->or(),
// WHERE (title LIKE '%val%' OR content LIKE '%val%' OR author LIKE '%val%')
'prefix' => Condition::like('name')->startsWith(),
// WHERE name LIKE 'val%'
'suffix' => Condition::like('name')->endsWith(),
// WHERE name LIKE '%val'
'search' => Condition::orGroup(
Condition::like('name'),
Condition::where('email'),
),
// WHERE ((name LIKE '%val%') OR (email = 'val'))
'date_range' => Condition::andGroup(
Condition::date('created_at')->gte(),
Condition::date('created_at')->lte(),
),
// WHERE ((DATE(created_at) >= 'val') AND (DATE(created_at) <= 'val'))
namespace App\Criteria;
use ByteTCore\Serpo\Criteria\BaseCriteria;
use Illuminate\Database\Eloquent\Builder;
class ActiveWithRecentPostsCriteria extends BaseCriteria
{
public function apply(Builder $query): void
{
$query->where('active', true)
->whereHas('posts', fn (Builder $q) => $q->where('created_at', '>=', now()->subDays(30)));
}
}
// In your repository:
use App\Criteria\ActiveWithRecentPostsCriteria;
protected function conditions(): array
{
return [
'recent_active' => Condition::custom(ActiveWithRecentPostsCriteria::class),
];
}
$active = $repo->where('active', true)->get(); // query resets after get()
$all = $repo->all(); // fresh query — returns all records
$repo->withoutAutoReset()
->where('active', true);
$count = $repo->count(); // same filtered query
$users = $repo->get(); // same filtered query