interaapps / uloleorm
There is no license information available for the latest version (3.3.1) of this package.
3.3.1
2024-05-24 10:07 UTC
Requires
- php: >=8.1
- ext-pdo: *
- interaapps/jsonplus: 1.0.5
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Getting started
UloleORM is an Object Relation Mapper written in PHP.
Uppm
uppm install uloleorm
Composer
composer require interaapps/uloleorm
User.php
<?php use de\interaapps\ulole\orm\ORMModel; use de\interaapps\ulole\orm\attributes\Column; use de\interaapps\ulole\orm\attributes\Table; #[Table("users")] class User { use ORMModel; #[Column] public int $id; #[Column] public ?string $name; #[Column(name: 'mail')] public ?string $eMail; #[Column] public ?string $password; #[Column] public ?string $description; // CreatedAt, UpdatedAt and DeletedAt will automatically fill the columns #[Column(sqlType: "TIMESTAMP")] #[CreatedAt] public ?string $createdAt; #[Column(sqlType: "TIMESTAMP")] #[UpdatedAt] public ?string $updatedAt; #[Column(sqlType: "TIMESTAMP"), DeletedAt] // More dirty syntax of multiple attributes public ?string $deletedAt; }
example.php
<?php UloleORM::database("main", new Database( username: 'root', password: '1234', database: 'testing', host: 'localhost', port: 3306, driver: 'mysql' // You can also use sqlite for testing or pgsql for postgres )); UloleORM::register(User::class); // Auto migrates all tables (You might not do this every time the user opens the page. Move it into a cli-command or something like this) UloleORM::autoMigrate(); // Inserting into table $user = new User; $user->name = "Okay"; $user->save(); // Fetching a single table entry $user = User::table() ->where("id", 2) ->first(); echo $user->name; // Fetching multiple entries $users = User::table() ->like("description", "I am%") ->get(); foreach ($users as $user) { echo $user->name; } // Updating User::table() ->where("id", 2) ->update(); // Updating entry $user = User::table()->where("id", "1")->first(); $user->name = "ninel"; $user->save(); // Deleting User::table() ->where("id", 2) ->delete(); // Deleting entry $user = User::table()->where("id", "1")->first(); $user->delete(); // Where User::table()->where("name", "John")->get(); User::table()->whereRaw("`name`", "=", "?", ["John"])->get(); User::table()->in("country", ["Germany", "France"])->get(); User::table()->notIn("country", ["Germany", "France"])->get(); User::table()->isNull("country")->get(); User::table()->notNull("country")->get(); User::table()->whereDay("createdAt", "23")->get(); User::table()->whereMonth("createdAt", "5")->get(); User::table()->whereYear("createdAt", "2022")->get(); User::table()->whereDate("createdAt", "23-5-2022")->get(); User::table()->whereTime("createdAt", "16:22:43")->get(); // Where Exists $postsOfAUser = UserPost::table() ->whereExists(User::class, fn(Query $q) => $q->whereColumns(UserPost::class, "userId", "=", User::class, "id")) ->all() // Helpful User::table()->count(); User::table()->sum("balance"); User::table()->sub("balance"); User::table()->avg("balance"); User::table()->max("balance"); User::table()->min("balance");
Selection
<?php User::table() // Simple where. Operator: '=' ->where("name", "Guenter") // Where with own opertator. It's also an 'AND' one because we already used where once ->where("name", "=", "Guenter") ->like("name", "Guent%") ->and(function($query){ $query->where("id", "1"); }) ->or(function($query){ $query->where("id", "1"); }) // PHP 7.4+ ->or(fn ($query) => $query->where("id", "1") ) // Nesting ->or(function($query){ $query->or(function($query){ $query->and(function($query){ $query->or(function($query){ $query->where("name", "lol"); }) }) }) }) // Orders by id in a descending order ->orderBy("id", true) // Limit ->limit(10) // Offset (requires a limit to be set) ->offset(0) ->get(); User::table()->each(function(User $entry){ echo $entry->name."\n"; });
Enums
<?php enum MyCases { case ALPHA; case BETA; } #[Table('my-model')] class MyModel { #[Column] public int $id; #[Column] public MyCases $myCases = MyCases::ALPHA; // Automatically fills the enum in db by its name }
Relations
<?php #[Table('my-model')] class MyModel { use ORMModel; #[Column] public int $id; // Automatically fills the id in database #[Column] public ?MySecondModel $second; /** @var array<Post> */ #[HasMany(Post::class, 'myModel')] public array $second = []; } #[Table('my-second-model')] class MySecondModel { use ORMModel; ... } #[Table('posts')] class Post { use ORMModel; #[Column] public MyModel $myModel; } // Exlude relation MyModel::table()->without('second')...; // Disable auto-fetch #[Column(fetch: false)] public ?MySecondModel $second; MyModel::table()->with('second')...;
Migration
$migrator = new Migrator("main"); $migrator ->setLogging(true) ->fromFolder("resources/migrations") ->up(); $migrator ->setLogging(true) ->fromFolder("resources/migrations") ->down(/*default val: 1*/);
resources/migrations/migration_22_0_11_create_users.php
<?php namespace testinglocal\migrations; use de\interaapps\ulole\orm\Database; use de\interaapps\ulole\orm\migration\Blueprint; use de\interaapps\ulole\orm\migration\Migration; return class implements Migration { public function up(Database $database) { return $database->create("users", function (Blueprint $blueprint) { $blueprint->id(); $blueprint->string("name"); $blueprint->string("password"); $blueprint->string("description"); $blueprint->enum("gender", ["FEMALE", "MALE", "OTHER", "DO_NOT_ANSWER"])->default('DO_NOT_ANSWER'); $blueprint->timestamp("created")->currentTimestamp(); }); } public function down(Database $database) { return $database->drop("users"); } }
resources/migrations/migration_22_0_13_edit_users.php
<?php namespace testinglocal\migrations; use de\interaapps\ulole\orm\Database; use de\interaapps\ulole\orm\migration\Blueprint; use de\interaapps\ulole\orm\migration\Migration; /** * CHANGED: */ return class implements Migration { public function up(Database $database) { return $database->edit("users", function (Blueprint $blueprint) { $blueprint->string("name")->default("Johnson"); $blueprint->string("mail"); }); } public function down(Database $database) { return $database->edit("users", function(Blueprint $blueprint){ $blueprint->string("name")->nullable()->default(null); $blueprint->string("mail")->drop(); }); } }
Auto-Migrate
// Automatically migrates all columns by its class structure and attributes UloleORM::autoMigrate(); // Or for a specific database: UloleORM::getDatabase("main")->autoMigrate();