Installation:
composer require sofa/eloquence
For individual extensions (e.g., Metable):
composer require sofa/eloquence-metable
Publish Config (if needed):
php artisan vendor:publish --provider="Sofa\Eloquence\EloquenceServiceProvider"
Check config/eloquence.php for extension-specific configurations (e.g., searchable drivers, metable storage).
First Use Case:
Searchable: Add Searchable trait to a model and define searchable fields:
use Sofa\Eloquence\Searchable\Searchable;
class Post extends Model
{
use Searchable;
protected $searchable = ['title', 'body'];
}
Query with:
$results = Post::search('laravel')->get();
Validable: Add Validable trait and define rules:
use Sofa\Eloquence\Validable\Validable;
class User extends Model
{
use Validable;
protected $rules = [
'name' => 'required|min:3',
'email' => 'required|email'
];
}
Validate on save:
$user = new User(['name' => 'John', 'email' => 'invalid']);
if ($user->validate()) {
$user->save(); // Fails silently if invalid
}
Metable: Store meta data dynamically:
use Sofa\Eloquence\Metable\Metable;
class Product extends Model
{
use Metable;
}
Set/get meta:
$product->setMeta('price', 19.99);
$price = $product->getMeta('price');
app/Models/ for existing implementations to replicate patterns.config/eloquence.php for extension-specific settings (e.g., searchable.driver).$posts = Post::search('query')->get();
Searchable config):
$posts = Post::search('query')
->with(['author']) // Eager load relations
->orderBy('published_at', 'desc')
->get();
SearchableServiceProvider to integrate with Algolia/Meilisearch:
// config/eloquence.php
'searchable' => [
'driver' => 'algolia',
'options' => [
'app_id' => env('ALGOLIA_APP_ID'),
'api_key' => env('ALGOLIA_API_KEY'),
],
];
$user = new User(['email' => 'invalid']);
$user->validate(); // Returns bool
$errors = $user->errors(); // Collection of errors
$data = ['name' => 'Test', 'email' => 'test@example.com'];
$user = User::create($data); // Automatically validates
protected $messages = [
'name.required' => 'A name is required!',
];
$product->setMeta('tags', ['sale', 'new']);
$tags = $product->getMeta('tags', []); // Default: []
meta column.$user->setMeta('profile', ['bio' => 'Hello'], 'Profile');
use Sofa\Eloquence\Mappable\Mappable;
class Order extends Model
{
use Mappable;
protected $mappable = [
'total' => 'amount',
'tax' => 'tax_rate',
];
}
Access mapped attributes:
$order->total; // Returns $order->amount
protected $mappable = [
'customer_name' => 'user.name',
];
use Sofa\Eloquence\Mutable\Mutable;
class User extends Model
{
use Mutable;
protected $mutable = [
'email' => [
'set' => ['strtolower'],
'get' => ['trim'],
],
];
}
Custom pipes:
$user->email = 'TEST@example.com'; // Triggers `strtolower` on set
Searchable + Validable for searchable, validated resources).class PostService {
public function search(string $query) {
return Post::search($query)->get();
}
}
Validable for API request validation:
use Sofa\Eloquence\Validable\Validable;
class StorePostRequest {
use Validable;
protected $rules = [
'title' => 'required|max:255',
];
}
Searchable Driver Mismatch:
database driver (full-text search). If using MySQL, ensure FULLTEXT indexes exist:
ALTER TABLE posts ADD FULLTEXT(title, body);
searchable.driver in config/eloquence.php (e.g., scout, algolia).Metable JSON Overhead:
meta table.Validable Mass Assignment:
$model->fill($data)->validate() bypasses mass assignment rules.$model->validate($data) to respect $fillable.Mutable Performance:
set + get) can slow down bulk operations.$user->disableMutators();
User::where(...)->update(...);
$user->enableMutators();
Mappable Ambiguity:
_mapped_total).\DB::enableQueryLog();
Post::search('test')->get();
\DB::getQueryLog();
dd($model->errors()->toArray());
$meta = $model->getMeta('key');
json_last_error(); // Debug JSON issues
Searchable Driver Options:
Sofa\Eloquence\Searchable\Contracts\SearchableDriver.'searchable' => [
'driver' => 'scout',
'options' => [
'model' => 'App\Models\Post',
],
],
Metable Storage:
meta column. Override with:
protected $metaColumn = 'custom_meta';
Mutable Defaults:
protected $mutable = [
'status' => [
'set' => ['default:draft'],
],
];
Custom Searchable Drivers:
Sofa\Eloquence\Searchable\AbstractDriver for new backends (e.g., Elasticsearch).Validable Rules:
$user->addRule('email', 'unique:users
How can I help you explore Laravel packages today?