1. Go to this page and download the library: Download marekskopal/orm 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/ */
marekskopal / orm example snippets
//Create DB connection - MySQL
$database = new MysqlDatabase('localhost', 'root', 'password', 'database');
//Create DB connection - PostgreSQL
$database = new PostgresDatabase('localhost', 'postgres', 'password', 'database');
//Create DB connection - SQLite
$database = new SqliteDatabase('/path/to/database.sqlite');
//Create schema
$schema = new SchemaBuilder()
->addEntityPath(__DIR__ . '/Entity')
->build();
$orm = new ORM($database, $schema);
//Create new entity
$user = new User(
'John',
'Doe',
);
$orm->getRepository(User::class)->persist($user);
//Find entity by id
$user = $orm->getRepository(User::class)
->findOne(['id' => 1]);
//Update entity
$user->firstName = 'Jane';
$orm->getRepository(User::class)->persist($user);
//Delete entity
$orm->getRepository(User::class)->delete($user);
use MarekSkopal\ORM\Attribute\Column;
use MarekSkopal\ORM\Attribute\ColumnEnum;
use MarekSkopal\ORM\Attribute\Entity;
use MarekSkopal\ORM\Enum\Type;
#[Entity]
final class User
{
#[Column(type: Type::Int, primary: true, autoIncrement: true)]
public int $id;
public function __construct(
#[Column(type: Type::Timestamp)]
public DateTimeImmutable $createdAt,
#[Column(type: Type::String)]
public string $name,
#[Column(type: Type::String, nullable: true, size: 50)]
public ?string $email,
#[Column(type: Type::Boolean)]
public bool $isActive,
#[ColumnEnum(enum: UserTypeEnum::class)]
public UserTypeEnum $type,
) {
}
}
#[Entity(table: 'users')]
final class User
{
#[Column(type: Type::String, name: 'my_last_name_column')]
public string $lastName;
}
#[Entity]
final class User
{
#[ManyToOne(entityClass: Address::class)]
public Address $address;
#[OneToMany(entityClass: User::class)]
public \Iterator $children;
}
#[Entity]
final class User
{
// Owning side — stores profile_id column
#[OneToOne(entityClass: Profile::class)]
public Profile $profile;
}
#[Entity]
final class Profile
{
// Inverse side — no column, loaded via User::$profile FK
#[OneToOne(entityClass: User::class, mappedBy: 'profile')]
public ?User $user;
}
#[Entity]
final class User
{
// Owning side — manages the user_tags join table
#[ManyToMany(
entityClass: Tag::class,
joinTable: 'user_tags',
joinColumn: 'user_id', // defaults to user_id
inverseJoinColumn: 'tag_id', // defaults to tag_id
)]
public Collection $tags;
}
#[Entity]
final class Tag
{
// Inverse side — loaded via User::$tags join table info
#[ManyToMany(entityClass: User::class, mappedBy: 'tags')]
public Collection $users;
}
use MarekSkopal\ORM\Schema\Enum\CascadeEnum;
#[Entity]
final class Author
{
#[OneToMany(entityClass: Post::class, cascade: [CascadeEnum::Persist, CascadeEnum::Remove])]
public Collection $posts;
}
$post1 = new Post('First Post', $author);
$post2 = new Post('Second Post', $author);
$author = new Author('John', new Collection([$post1, $post2]));
// Persists author and both posts in the correct order
$orm->getRepository(Author::class)->persist($author);
$author = $orm->getRepository(Author::class)->findOne(['id' => 1]);
// Deletes all posts belonging to the author, then deletes the author
$orm->getRepository(Author::class)->delete($author);
#[Entity]
final class User
{
#[Column(type: Type::Timestamp)]
public DateTimeImmutable $createdAt;
#[Column(type: Type::DateTime)]
public DateTime $updatedAt;
}
use MarekSkopal\ORM\Attribute\ColumnEnum;
#[Entity]
final class User
{
#[ColumnEnum(enum: UserTypeEnum::class)]
public UserTypeEnum $type;
}
use MarekSkopal\ORM\Repository\AbstractRepository;
/** @extends AbstractRepository<User> */
class UserRepository extends AbstractRepository
{
}
#[Entity(repositoryClass: UserRepository::class)]
final class User
{
}
// Without with(): 1 query for users + N queries (one per user) when accessing $user->address
$users = $queryProvider->select(User::class)->fetchAll();
// With with(): 1 query for users + 1 batched query for all distinct addresses
$users = $queryProvider->select(User::class)
->with('address')
->fetchAll();
// Multiple relations can be eager-loaded at once
$users = $queryProvider->select(User::class)
->with('address', 'profile')
->fetchAll();
$user = new User(
'John',
'Doe',
);
$queryProvider->insert(User::class)
->entity($user)
->execute();
//created entity will have id set automatically
$userA = new User(
'John',
'Doe',
);
$userB = new User(
'Jane',
'Doe',
);
$queryProvider->insert(User::class)
->entity($userA)
->entity($userB)
->execute();