{"id":41746861,"url":"https://github.com/interaapps/ulole-orm","last_synced_at":"2026-01-25T01:04:03.194Z","repository":{"id":56992503,"uuid":"209365731","full_name":"interaapps/ulole-orm","owner":"interaapps","description":"A PHP ORM","archived":false,"fork":false,"pushed_at":"2024-06-12T19:18:15.000Z","size":126,"stargazers_count":6,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-12-01T15:37:14.406Z","etag":null,"topics":["orm","php-database","php-mysql","php-orm","php-orm-mysql","php-orm-pdo","php-pgsql"],"latest_commit_sha":null,"homepage":"https://intera.dev/docs/ulole/orm","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/interaapps.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-09-18T17:23:31.000Z","updated_at":"2025-10-26T02:00:33.000Z","dependencies_parsed_at":"2024-06-13T01:09:00.976Z","dependency_job_id":"f0fe43e4-47a3-4923-b3c6-49d6523742d1","html_url":"https://github.com/interaapps/ulole-orm","commit_stats":{"total_commits":33,"total_committers":2,"mean_commits":16.5,"dds":"0.33333333333333337","last_synced_commit":"3703c04259222da5606f9930a36d7fffcfb9e60d"},"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/interaapps/ulole-orm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/interaapps%2Fulole-orm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/interaapps%2Fulole-orm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/interaapps%2Fulole-orm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/interaapps%2Fulole-orm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/interaapps","download_url":"https://codeload.github.com/interaapps/ulole-orm/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/interaapps%2Fulole-orm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28740410,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-24T22:12:27.248Z","status":"ssl_error","status_checked_at":"2026-01-24T22:12:10.529Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["orm","php-database","php-mysql","php-orm","php-orm-mysql","php-orm-pdo","php-pgsql"],"created_at":"2026-01-25T01:04:03.127Z","updated_at":"2026-01-25T01:04:03.188Z","avatar_url":"https://github.com/interaapps.png","language":"PHP","readme":"# Ulole-ORM `3.3`\n\n## Getting started\nUloleORM is an Object Relation Mapper written in PHP.\n#### Uppm\n```\nuppm install uloleorm\n```\n#### Composer\n```\ncomposer require interaapps/uloleorm\n```\n### User.php\n```php\n\u003c?php\nuse de\\interaapps\\ulole\\orm\\ORMModel;\nuse de\\interaapps\\ulole\\orm\\attributes\\Column;\nuse de\\interaapps\\ulole\\orm\\attributes\\Table;\n\n#[Table(\"users\")]\nclass User {\n    use ORMModel;\n\n    #[Column]\n    public int $id;\n    \n    #[Column]\n    public ?string $name;\n    \n    #[Column(name: 'mail')]\n    public ?string $eMail;\n    \n    #[Column]\n    public ?string $password;\n    \n    #[Column]\n    public ?string $description;\n    \n    \n    // CreatedAt, UpdatedAt and DeletedAt will automatically fill the columns\n    #[Column(sqlType: \"TIMESTAMP\")]\n    #[CreatedAt]\n    public ?string $createdAt;\n\n    #[Column(sqlType: \"TIMESTAMP\")]\n    #[UpdatedAt]\n    public ?string $updatedAt;\n\n    #[Column(sqlType: \"TIMESTAMP\"), DeletedAt] // More dirty syntax of multiple attributes\n    public ?string $deletedAt;\n}\n```\n### example.php\n```php\n\u003c?php\nUloleORM::database(\"main\", new Database(\n    username: 'root',\n    password: '1234',\n    database: 'testing',\n    host: 'localhost',\n    port: 3306,\n    driver: 'mysql' // You can also use sqlite for testing or pgsql for postgres\n));\n\nUloleORM::register(User::class);\n\n// 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)\nUloleORM::autoMigrate();\n\n// Inserting into table\n$user = new User;\n$user-\u003ename = \"Okay\";\n$user-\u003esave();\n\n// Fetching a single table entry\n$user = User::table()\n    -\u003ewhere(\"id\", 2)\n    -\u003efirst();\n\necho $user-\u003ename;\n\n// Fetching multiple entries\n$users = User::table()\n    -\u003elike(\"description\", \"I am%\")\n    -\u003eget();\n\nforeach ($users as $user) {\n    echo $user-\u003ename;\n}\n\n// Updating\nUser::table()\n    -\u003ewhere(\"id\", 2)\n    -\u003eupdate();\n\n// Updating entry\n$user = User::table()-\u003ewhere(\"id\", \"1\")-\u003efirst();\n$user-\u003ename = \"ninel\";\n$user-\u003esave();\n\n// Deleting\nUser::table()\n    -\u003ewhere(\"id\", 2)\n    -\u003edelete();\n\n// Deleting entry\n$user = User::table()-\u003ewhere(\"id\", \"1\")-\u003efirst();\n$user-\u003edelete();\n\n// Where\nUser::table()-\u003ewhere(\"name\", \"John\")-\u003eget();\nUser::table()-\u003ewhereRaw(\"`name`\", \"=\", \"?\", [\"John\"])-\u003eget();\nUser::table()-\u003ein(\"country\", [\"Germany\", \"France\"])-\u003eget();\nUser::table()-\u003enotIn(\"country\", [\"Germany\", \"France\"])-\u003eget();\n\nUser::table()-\u003eisNull(\"country\")-\u003eget();\nUser::table()-\u003enotNull(\"country\")-\u003eget();\n\nUser::table()-\u003ewhereDay(\"createdAt\", \"23\")-\u003eget();\nUser::table()-\u003ewhereMonth(\"createdAt\", \"5\")-\u003eget();\nUser::table()-\u003ewhereYear(\"createdAt\", \"2022\")-\u003eget();\nUser::table()-\u003ewhereDate(\"createdAt\", \"23-5-2022\")-\u003eget();\nUser::table()-\u003ewhereTime(\"createdAt\", \"16:22:43\")-\u003eget();\n\n// Where Exists\n$postsOfAUser = UserPost::table()\n    -\u003ewhereExists(User::class, fn(Query $q) =\u003e $q-\u003ewhereColumns(UserPost::class, \"userId\", \"=\", User::class, \"id\"))\n    -\u003eall()\n    \n// Helpful\nUser::table()-\u003ecount();\nUser::table()-\u003esum(\"balance\");\nUser::table()-\u003esub(\"balance\");\nUser::table()-\u003eavg(\"balance\");\nUser::table()-\u003emax(\"balance\");\nUser::table()-\u003emin(\"balance\");\n\n```\n\n## Selection\n```php\n\u003c?php\nUser::table()\n    // Simple where. Operator: '='\n    -\u003ewhere(\"name\", \"Guenter\")\n    // Where with own opertator. It's also an 'AND' one because we already used where once\n    -\u003ewhere(\"name\", \"=\", \"Guenter\")\n\n    -\u003elike(\"name\", \"Guent%\")\n\n    -\u003eand(function($query){\n        $query-\u003ewhere(\"id\", \"1\");\n    })\n\n    -\u003eor(function($query){\n        $query-\u003ewhere(\"id\", \"1\");\n    })\n\n    // PHP 7.4+\n    -\u003eor(fn ($query) =\u003e $query-\u003ewhere(\"id\", \"1\") )\n\n    // Nesting\n    -\u003eor(function($query){\n        $query-\u003eor(function($query){\n            $query-\u003eand(function($query){\n                $query-\u003eor(function($query){\n                    $query-\u003ewhere(\"name\", \"lol\");\n                })\n            })\n        })\n    })\n\n    // Orders by id in a descending order\n    -\u003eorderBy(\"id\", true)\n    // Limit\n    -\u003elimit(10)\n    // Offset (requires a limit to be set)\n    -\u003eoffset(0)\n    -\u003eget();\n\n\nUser::table()-\u003eeach(function(User $entry){\n    echo $entry-\u003ename.\"\\n\";\n});\n\n```\n\n## Enums\n```php\n\u003c?php\nenum MyCases {\n    case ALPHA;\n    case BETA;\n}\n\n#[Table('my-model')]\nclass MyModel {\n    #[Column]\n    public int $id;\n    \n    #[Column]\n    public MyCases $myCases = MyCases::ALPHA; // Automatically fills the enum in db by its name\n}\n```\n## Relations\n```php\n\u003c?php\n\n#[Table('my-model')]\nclass MyModel {\n    use ORMModel;\n    \n    #[Column]\n    public int $id;\n    \n    // Automatically fills the id in database\n    #[Column]\n    public ?MySecondModel $second;\n    \n    /** @var array\u003cPost\u003e */\n    #[HasMany(Post::class, 'myModel')]\n    public array $second = [];\n}\n\n#[Table('my-second-model')]\nclass MySecondModel {\n    use ORMModel;\n    ...\n}\n\n#[Table('posts')]\nclass Post {\n    use ORMModel;\n    \n    #[Column]\n    public MyModel $myModel;\n}\n\n// Exlude relation\nMyModel::table()-\u003ewithout('second')...;\n\n// Disable auto-fetch\n#[Column(fetch: false)]\npublic ?MySecondModel $second;\n\nMyModel::table()-\u003ewith('second')...;\n```\n\n## Migration\n```php\n$migrator = new Migrator(\"main\"); \n$migrator\n    -\u003esetLogging(true)\n    -\u003efromFolder(\"resources/migrations\")\n    -\u003eup();\n\n$migrator\n    -\u003esetLogging(true)\n    -\u003efromFolder(\"resources/migrations\")\n    -\u003edown(/*default val: 1*/);\n```\n\n#### resources/migrations/migration_22_0_11_create_users.php\n```php\n\u003c?php\nnamespace testinglocal\\migrations;\n\nuse de\\interaapps\\ulole\\orm\\Database;\nuse de\\interaapps\\ulole\\orm\\migration\\Blueprint;\nuse de\\interaapps\\ulole\\orm\\migration\\Migration;\n\nreturn class implements Migration {\n    public function up(Database $database) {\n        return $database-\u003ecreate(\"users\", function (Blueprint $blueprint) {\n            $blueprint-\u003eid();\n            $blueprint-\u003estring(\"name\");\n            $blueprint-\u003estring(\"password\");\n            $blueprint-\u003estring(\"description\");\n            $blueprint-\u003eenum(\"gender\", [\"FEMALE\", \"MALE\", \"OTHER\", \"DO_NOT_ANSWER\"])-\u003edefault('DO_NOT_ANSWER');\n            $blueprint-\u003etimestamp(\"created\")-\u003ecurrentTimestamp();\n        });\n    }\n\n    public function down(Database $database) {\n        return $database-\u003edrop(\"users\");\n    }\n}\n```\n\n#### resources/migrations/migration_22_0_13_edit_users.php\n```php\n\u003c?php\nnamespace testinglocal\\migrations;\n\nuse de\\interaapps\\ulole\\orm\\Database;\nuse de\\interaapps\\ulole\\orm\\migration\\Blueprint;\nuse de\\interaapps\\ulole\\orm\\migration\\Migration;\n\n/**\n * CHANGED: \n */\nreturn class implements Migration {\n    public function up(Database $database) {\n        return $database-\u003eedit(\"users\", function (Blueprint $blueprint) {\n            $blueprint-\u003estring(\"name\")-\u003edefault(\"Johnson\");\n            $blueprint-\u003estring(\"mail\");\n        });\n    }\n\n    public function down(Database $database) {\n        return $database-\u003eedit(\"users\", function(Blueprint $blueprint){\n            $blueprint-\u003estring(\"name\")-\u003enullable()-\u003edefault(null);\n            $blueprint-\u003estring(\"mail\")-\u003edrop();\n        });\n    }\n}\n```\n\n## Auto-Migrate\n```php\n// Automatically migrates all columns by its class structure and attributes\nUloleORM::autoMigrate();\n\n// Or for a specific database:\nUloleORM::getDatabase(\"main\")-\u003eautoMigrate();\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finteraapps%2Fulole-orm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finteraapps%2Fulole-orm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finteraapps%2Fulole-orm/lists"}