jimwins / titi
A lightweight nearly-zero-configuration object-relational mapper and fluent query builder for PHP, plus a lightweight ActiveRecord implementation
Fund package maintenance!
jimwins
Installs: 2 666
Dependents: 0
Suggesters: 0
Security: 0
Stars: 2
Watchers: 3
Forks: 1
Open Issues: 0
Requires
- php: >=5.6.0
Requires (Dev)
- ext-pdo_sqlite: *
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.0
README
Titi is a lightweight nearly-zero-configuration object-relational mapper and fluent query builder for PHP, plus a lightweight ActiveRecord implementation.
Titi was forked from Idiorm and Paris (combined into a single repo).
Tested on PHP 8.1.16 and MySQL 8.0.32 - may work on earlier versions with PDO and the correct database drivers.
Released under a BSD license.
Features
- Makes simple queries and simple CRUD operations completely painless.
- Gets out of the way when more complex SQL is required.
- Built on top of PDO.
- Uses prepared statements throughout to protect against SQL injection attacks.
- Requires no model classes, no XML configuration and no code generation: works out of the box, given only a connection string.
- Consists of one main class called
ORM
. Additional classes are prefixed withTiti
. Minimal global namespace pollution. - Database agnostic. Currently supports SQLite, MySQL, Firebird and PostgreSQL. May support others, please give it a try!
- Supports collections of models with method chaining to filter or apply actions to multiple results at once.
- Multiple connections supported
- PSR-1 compliant methods (any method can be called in camelCase instead of underscores eg.
find_many()
becomesfindMany()
) - you'll need PHP 5.3+
Documentation
The documentation is hosted on Read the Docs: titi.rtfd.io.
Building the Docs
You will need to install Sphinx and then in the docs folder run:
make html
The documentation will now be in docs/_build/html/index.html
Let's See Some Code
require 'vendor/autoload.php'; use \Titi\ORM; use \Titi\Model; $user = ORM::for_table('user') ->where_equal('username', 'j4mie') ->find_one(); $user->first_name = 'Jamie'; $user->save(); $tweets = ORM::for_table('tweet') ->select('tweet.*') ->join('user', array( 'user.id', '=', 'tweet.user_id' )) ->where_equal('user.username', 'j4mie') ->find_many(); foreach ($tweets as $tweet) { echo $tweet->text; } /* ActiveRecord model */ class User extends Model { public function tweets() { return $this->has_many('Tweet'); } } class Tweet extends Model {} $user = Model::factory('User') ->where_equal('username', 'j4mie') ->find_one(); $user->first_name = 'Jamie'; $user->save(); $tweets = $user->tweets()->find_many(); foreach ($tweets as $tweet) { echo $tweet->text; }
Tests
Tests are written with PHPUnit and be run through composer
composer test
To see the test progress and results:
composer -v test