1. Go to this page and download the library: Download fishyboat21/extendorm 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/ */
FishyBoat21\ExtendOrm\Database;
use FishyBoat21\ExtendOrm\QueryBuilder2\QueryBuilder2;
use FishyBoat21\ExtendOrm\Attribute\Table;
use FishyBoat21\ExtendOrm\Attribute\Column;
use FishyBoat21\ExtendOrm\Attribute\PrimaryKey;
use FishyBoat21\ExtendOrm\Model;
use PDO;
// 1. Setup database connection (MySQL example)
$pdo = new PDO(
'mysql:host=localhost;dbname=mydb;charset=utf8mb4',
'username',
'password',
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
// For PostgreSQL:
// $pdo = new PDO('pgsql:host=localhost;dbname=mydb', 'username', 'password');
// For SQLite:
// $pdo = new PDO('sqlite:/path/to/database.sqlite');
// 2. Boot the ORM
Database::Boot($pdo);
// 3. Create query builder
$qb = new QueryBuilder2();
// 4. Define your model
#[Table('users')]
class User extends Model {
#[PrimaryKey]
#[Column('id')]
public int $id;
#[Column('username')]
public string $username;
#[Column('email')]
public string $email;
}
// 5. Create and save a record
$user = new User($qb);
$user->username = 'johndoe';
$user->email = '[email protected]';
$user->save();
// 6. Find records
use FishyBoat21\ExtendOrm\Criteria;
use FishyBoat21\ExtendOrm\Criterion;
use FishyBoat21\ExtendOrm\QueryBuilder2\QueryBuilderOperator;
$criteria = new Criteria();
$criteria->Add(new Criterion('id', QueryBuilderOperator::Equals, 1));
$foundUser = User::FindOne($criteria, $qb);
echo $foundUser->username; // Output: johndoe
use FishyBoat21\ExtendOrm\Database;
use PDO;
// MySQL
$pdo = new PDO(
'mysql:host=localhost;dbname=mydb;charset=utf8mb4',
'username',
'password',
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
// PostgreSQL
// $pdo = new PDO(
// 'pgsql:host=localhost;dbname=mydb',
// 'username',
// 'password',
// [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
// );
// SQLite
// $pdo = new PDO('sqlite:/path/to/database.sqlite');
// Boot the ORM with your PDO connection
Database::Boot($pdo);
// Get instance later in your code
$db = Database::GetInstance();
$connection = $db->GetConnection();
use FishyBoat21\ExtendOrm\Model;
use FishyBoat21\ExtendOrm\Attribute\Table;
use FishyBoat21\ExtendOrm\Attribute\Column;
use FishyBoat21\ExtendOrm\Attribute\PrimaryKey;
#[Table('users')]
class User extends Model {
#[PrimaryKey]
#[Column('id')]
public int $id;
#[Column('username')]
public string $username;
#[Column('email')]
public string $email;
#[Column('created_at')]
public ?string $created_at = null;
}
use FishyBoat21\ExtendOrm\Attribute\Relation;
use FishyBoat21\ExtendOrm\Attribute\Relation\RelationType;
#[Table('users')]
class User extends Model {
#[PrimaryKey]
#[Column('id')]
public int $id;
#[Column('username')]
public string $username;
#[Relation(
type: RelationType::HasOne,
target: Profile::class,
foreignKey: 'user_id',
localKey: 'id',
ownerKey: 'id'
)]
public ?Profile $profile;
}
#[Table('users')]
class User extends Model {
#[PrimaryKey]
#[Column('id')]
public int $id;
#[Relation(
type: RelationType::HasMany,
target: Post::class,
foreignKey: 'user_id',
localKey: 'id',
ownerKey: 'id'
)]
public array $posts;
}
#[Table('posts')]
class Post extends Model {
#[PrimaryKey]
#[Column('id')]
public int $id;
#[Column('user_id')]
public int $user_id;
#[Relation(
type: RelationType::BelongsTo,
target: User::class,
foreignKey: 'user_id',
localKey: 'user_id',
ownerKey: 'id'
)]
public ?User $author;
}
#[Table('posts')]
class Post extends Model {
#[PrimaryKey]
#[Column('id')]
public int $id;
#[Column('user_id')]
public int $user_id;
#[Column('category_id')]
public ?int $category_id = null;
#[Column('title')]
public string $title;
#[Column('content')]
public string $content;
#[Column('published_at')]
public ?string $published_at = null;
// BelongsTo: Post belongs to User (author)
#[Relation(
type: RelationType::BelongsTo,
target: User::class,
foreignKey: 'user_id',
localKey: 'user_id',
ownerKey: 'id'
)]
public ?User $author;
// BelongsTo: Post belongs to Category
#[Relation(
type: RelationType::BelongsTo,
target: Category::class,
foreignKey: 'category_id',
localKey: 'category_id',
ownerKey: 'id'
)]
public ?Category $category;
// HasMany: Post has many Comments
#[Relation(
type: RelationType::HasMany,
target: Comment::class,
foreignKey: 'post_id',
localKey: 'id',
ownerKey: 'id'
)]
public array $comments;
}
use FishyBoat21\ExtendOrm\Criteria;
use FishyBoat21\ExtendOrm\Criterion;
use FishyBoat21\ExtendOrm\QueryBuilder2\QueryBuilderOperator;
// Find one record
$criteria = new Criteria();
$criteria->Add(new Criterion('id', QueryBuilderOperator::Equals, 1));
$user = User::FindOne($criteria, $qb);
// Find many records
$criteria = new Criteria();
$criteria->Add(new Criterion('email', QueryBuilderOperator::Like, '%@gmail.com'));
$users = User::FindMany($criteria, $qb);
foreach ($users as $user) {
echo $user->username . "\n";
}
// Pagination (limit, offset, criteria, queryBuilder)
$posts = Post::Paging(10, 20, $criteria, $qb); // Page 3, 10 per page
// Find the record first
$criteria = new Criteria();
$criteria->Add(new Criterion('id', QueryBuilderOperator::Equals, 1));
$user = User::FindOne($criteria, $qb);
// Modify and save
$user->username = 'updated_name';
$user->email = '[email protected]';
$user->save(); // Performs UPDATE (primary key exists)
$criteria = new Criteria();
$criteria->Add(new Criterion('id', QueryBuilderOperator::Equals, 1));
$user = User::FindOne($criteria, $qb);
if ($user) {
$user->delete();
}
use FishyBoat21\ExtendOrm\QueryBuilder2\QueryBuilderOperator;
QueryBuilderOperator::Equals // =
QueryBuilderOperator::NotEqual // !=
QueryBuilderOperator::LessThan // <
QueryBuilderOperator::MoreThan // >
QueryBuilderOperator::LessThanEquals// <=
QueryBuilderOperator::MoreThanEquals// >=
QueryBuilderOperator::Like // LIKE
QueryBuilderOperator::NotLike // NOT LIKE
QueryBuilderOperator::Is // IS (for NULL checks)
use FishyBoat21\ExtendOrm\Sort;
use FishyBoat21\ExtendOrm\QueryBuilder2\QueryBuilderSortType;
$criteria->AddSort(new Sort('created_at', QueryBuilderSortType::Descending));
$criteria->AddSort(new Sort('name', QueryBuilderSortType::Ascending));
use FishyBoat21\ExtendOrm\Database;
$db = Database::GetInstance();
$db->Transaction(function($pdo) use ($qb) {
// All operations in this closure run in a transaction
$user = new User($qb);
$user->username = 'newuser';
$user->email = '[email protected]';
$user->save();
$profile = new Profile($qb);
$profile->user_id = $user->id;
$profile->phone = '+1-555-0123';
$profile->save();
// If any exception occurs, everything rolls back automatically
// No need to manually commit or rollback
});
FishyBoat21\ExtendOrm\Database;
use FishyBoat21\ExtendOrm\QueryBuilder2\QueryBuilder2;
use FishyBoat21\ExtendOrm\Model;
use FishyBoat21\ExtendOrm\Attribute\Table;
use FishyBoat21\ExtendOrm\Attribute\Column;
use FishyBoat21\ExtendOrm\Attribute\PrimaryKey;
use FishyBoat21\ExtendOrm\Attribute\Relation;
use FishyBoat21\ExtendOrm\Attribute\Relation\RelationType;
use FishyBoat21\ExtendOrm\Criteria;
use FishyBoat21\ExtendOrm\Criterion;
use FishyBoat21\ExtendOrm\QueryBuilder2\QueryBuilderOperator;
use PDO;
// Setup
$pdo = new PDO('mysql:host=localhost;dbname=blog', 'user', 'pass');
Database::Boot($pdo);
$qb = new QueryBuilder2();
// Define Models
#[Table('users')]
class User extends Model {
#[PrimaryKey] #[Column('id')] public int $id;
#[Column('username')] public string $username;
#[Column('email')] public string $email;
#[Relation(
type: RelationType::HasMany,
target: Post::class,
foreignKey: 'user_id',
localKey: 'id',
ownerKey: 'id'
)]
public array $posts;
}
#[Table('posts')]
class Post extends Model {
#[PrimaryKey] #[Column('id')] public int $id;
#[Column('user_id')] public int $user_id;
#[Column('title')] public string $title;
#[Column('content')] public string $content;
#[Column('published_at')] public ?string $published_at = null;
#[Relation(
type: RelationType::BelongsTo,
target: User::class,
foreignKey: 'user_id',
localKey: 'user_id',
ownerKey: 'id'
)]
public ?User $author;
}
// Create a user and post
$user = new User($qb);
$user->username = 'johndoe';
$user->email = '[email protected]';
$user->save();
$post = new Post($qb);
$post->user_id = $user->id;
$post->title = 'My First Post';
$post->content = 'Hello, world!';
$post->published_at = date('Y-m-d H:i:s');
$post->save();
// Query with relationships
$criteria = new Criteria();
$criteria->Add(new Criterion('user_id', QueryBuilderOperator::Equals, $user->id));
$posts = Post::FindMany($criteria, $qb);
foreach ($posts as $post) {
echo $post->title . " by " . $post->author->username . "\n";
}
// Find published posts with more than 100 views, sorted by date
$criteria = new Criteria();
$criteria->Add(new Criterion('published', QueryBuilderOperator::Equals, 1));
$criteria->Add(new Criterion('views', QueryBuilderOperator::MoreThan, 100));
$criteria->AddSort(new Sort('published_at', QueryBuilderSortType::Descending));
// Get page 3 with 10 items per page
$posts = Post::Paging(10, 20, $criteria, $qb);
foreach ($posts as $post) {
echo $post->title . "\n";
}