Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/tflori/orm

just another orm...
https://github.com/tflori/orm

database orm pdo php

Last synced: 9 days ago
JSON representation

just another orm...

Awesome Lists containing this project

README

        

# tflori/orm

[![.github/workflows/push.yml](https://github.com/tflori/orm/actions/workflows/push.yml/badge.svg)](https://github.com/tflori/orm/actions/workflows/push.yml)
[![Test Coverage](https://api.codeclimate.com/v1/badges/9434ba649634cb577b87/test_coverage)](https://codeclimate.com/github/tflori/orm/test_coverage)
[![Maintainability](https://api.codeclimate.com/v1/badges/9434ba649634cb577b87/maintainability)](https://codeclimate.com/github/tflori/orm/maintainability)
[![Latest Stable Version](https://poser.pugx.org/tflori/orm/v/stable.svg)](https://packagist.org/packages/tflori/orm)
[![Total Downloads](https://poser.pugx.org/tflori/orm/downloads.svg)](https://packagist.org/packages/tflori/orm)
[![License](https://poser.pugx.org/tflori/orm/license.svg)](https://packagist.org/packages/tflori/orm)

![Logo](logo.svg)

**TL;DR** Others suck, we can do it better.

Why to create another ORM? There are not enough ORM implementations for PHP already?

Yes, there are a lot of implementations:
- doctrine/orm
- heavy: 8,8 MB of everything that you don't need, 6 direct dependencies with own dependencies
- annotations that makes it unreadable
- big amount of queries or very slow queries when it comes to join across multiple tables
- propel/propel
- still not stable 2.0-dev
- even more heavy than doctrine
- requires a lot of configurations
- j4mie/idiorim and j4mie/paris
- uses a lot of static methods and gets hard to test
- not compatible to existing dependecy injection models
- last update 2 years ago
- everything in one file
- ...

This implementation will have the following features:
- no configuration required
- ok some bit for sure (e.g. how to connect to your database?)
- of course this is only possible if you setup your database as we think your database should look like. If not you
should only have to setup the rules of your system and naming conventions.
- simple to use
- lightweight sources
- fast

How to achieve this features? The main goal of Doctrine seems to abstract everything - at the end you should be able
to replace the whole DBMS behind your app and switch from postgresql to sqlite. That requires not only a lot of
sources. It also requires some extra cycles to get these abstraction to work.

This library will only produce ANSI-SQL that every SQL database should understand. Other queries have to be written by
hand. This has two reasons:

1. You can write much faster and efficient queries
2. We don't need to write a lot of abstraction (more code; more bugs)

This library will not fetch any mistake a developer can make. It aims to be a helper to store data in your database. Not
to replace your database and your knowledge how to use this database. You can make a lot of errors - less than without
this library but still a lot. When you make an error that is not catched (mostly we catch only mistakes that would
cause a fatal error instead) you will get a `PDOException`.

## Setup

Install it via composer, configure it, use it.
```bash
composer require tflori/orm
```

```php
['pgsql', 'mydb', 'postgres']
]);

$user = $entityManager->fetch(User::class, 1);

echo $user->username;
```

Read [the docs](https://tflori.github.io/orm) for more information.

## Known Issues

### Composite Primary Keys

[#52](https://github.com/tflori/orm/issues/52) Composite primary keys require SQLite >= 3.15 (or another database) to get the synchronization after insert working. The syntax used got added in [SQLite 3.15](https://www.sqlite.org/changes.html#version_3_15_0).

## Contribute

Please follow PSR-2 style guide and use this command to update the api reference documentation:

```console
$ docker run --rm --user $(id -u) -v $(pwd):/data -v $(pwd)/docs/_reference:/opt/phpdoc/data/templates/_reference iras/phpdoc2:2 phpdoc -c phpdoc.xml
```

Before creating a pull request please make sure that the unit tests are green and the coverage remains the same:

```console
$ docker run --rm --user $(id -u) -v $(pwd):/app -w /app iras/php7 vendor/bin/phpunit
### with coverage:
$ docker run --rm --user $(id -u) -v $(pwd):/app -w /app iras/php7 php -dzend_extension=xdebug.so vendor/bin/phpunit --coverage-text
```