Installation Add the bundle via Composer:
composer require baikal/model-bundle
Enable the bundle in config/bundles.php (Symfony) or config/app.php (Laravel via Symfony bridge):
return [
// ...
Baikal\ModelBundle\BaikalModelBundle::class => ['all' => true],
];
First Use Case
Define a model extending Baikal\ModelBundle\Model\AbstractModel:
namespace App\Models;
use Baikal\ModelBundle\Model\AbstractModel;
class User extends AbstractModel
{
protected $table = 'users';
protected $primaryKey = 'id';
}
Use the model in a controller:
use App\Models\User;
public function index()
{
$users = User::all(); // Uses Baikal's query builder
return response()->json($users);
}
Key Entry Points
AbstractModel for basic CRUD.Baikal\ModelBundle\Query\QueryBuilder for complex queries.baikal.model.created, baikal.model.updated, etc.CRUD Operations Leverage built-in methods:
// Create
$user = new User(['name' => 'John']);
$user->save();
// Read
$user = User::find(1);
$users = User::where('active', true)->get();
// Update
$user->name = 'Jane';
$user->save();
// Delete
$user->delete();
Query Building Use the query builder for dynamic queries:
$query = User::query()
->where('role', 'admin')
->orderBy('created_at', 'desc')
->limit(10);
$results = $query->get();
Relationships
Define relationships via hasOne, hasMany, etc.:
class Post extends AbstractModel
{
public function user()
{
return $this->hasOne(User::class, 'id', 'user_id');
}
}
Events and Observers Attach observers to models:
// config/baikal.php
'observers' => [
User::class => [
\App\Observers\UserObserver::class,
],
];
$users = User::query()->where('active', true)->get(); // Baikal
$users = User::whereHas('posts')->get(); // Eloquent
ApiResource for JSON serialization:
class UserResource extends \Illuminate\Http\Resources\Json\JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
];
}
}
Namespace Conflicts
Ensure Baikal\ModelBundle is not shadowed by other packages. Prefix classes if needed:
use Baikal\ModelBundle\Model\AbstractModel as BaikalAbstractModel;
Query Builder Overrides
Baikal’s query builder may override Laravel’s. Explicitly use Baikal\ModelBundle\Query\QueryBuilder if issues arise:
$query = new \Baikal\ModelBundle\Query\QueryBuilder(User::class);
Event System Quirks
Events like baikal.model.saving may not fire if validation fails. Use baikal.model.saved for post-save logic.
Primary Key Assumptions
Baikal assumes $primaryKey = 'id' by default. Override in your model if using a custom key:
protected $primaryKey = 'uuid';
Enable Logging
Add to config/baikal.php:
'debug' => env('APP_DEBUG', false),
Logs queries and events to storage/logs/baikal.log.
Query Dumping
Use the dump() method to inspect queries:
$query = User::where('active', true);
$query->dump(); // Outputs SQL to logs
Custom Query Types
Extend Baikal\ModelBundle\Query\QueryBuilder for custom clauses:
namespace App\Extensions;
use Baikal\ModelBundle\Query\QueryBuilder;
class CustomQueryBuilder extends QueryBuilder
{
public function customWhere($field, $operator, $value)
{
// Custom logic
}
}
Model Events Override event methods in your model:
class User extends AbstractModel
{
public function saving(array $options = [])
{
$this->name = strtolower($this->name);
parent::saving($options);
}
}
Database Drivers
Baikal supports multiple drivers (MySQL, PostgreSQL, SQLite). Configure in config/baikal.php:
'connection' => 'pgsql',
How can I help you explore Laravel packages today?