No ORM storage of PHP object
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


Build Status Latest Stable Version

No-ORM storage of PHP object.

PHP-Noorm makes it easy to persist your PHP object, without the overhead of Object-Relation Mapping (ORM).


Install the latest version using composer:

$ composer require webd/noorm


First, load composer, and define a directory where your objects can be saved (it has to be writable).

require_once __DIR__  . "/../vendor/autoload.php";
use noorm\Persistent;

// Indicate where to save data

Define the classes that you want to persist. They have to extend the class \noorm\Persitent.

class Client extends Persistent {

  public $name = "";
  private $val;
   * Use annotations to indicate $items is a many-to-many relation to class Item
   * @target Item
   * @var \noorm\ManyToManyRelation
  public $items;
  public function SetName($name) {
    $this->name = $name;
    return $this;

  public function GetVal() {
    return $this->val;

  public function SetVal($val) {
    $this->val = $val;
    return $this;

class Item extends Persistent {
  public $name = "";
   * Use annotations to indicate $clients is a many-to-many relation to Client
   * @target Client
   * @var \noorm\ManyToManyRelation
  public $clients;

You can now create objects and save them on disk.

// Create a new object and save it to disk
$client = new Client();
$client->name = "C1";

The static method All() returns a \noorm\Dataset representing all the saved objects of this class. You can use this dataset to filter, sort or list your objects.

// Show all clients
/* @var $client Client */
foreach (Client::All()->Collect() as $client) {
  echo $client->name . " : ";
  echo $client->items->Get()->Count() . " items\n";

PHP-Noorm also manages many-to-many relations for you. These are described using annotations in your class definition.

// Create a new item
$item = new Item();
$item->name = "I";

// Add this item to the first client
$client = Client::All()->First();

Known bugs and limitations

These are planned improvements:

  • There can be only one many-to-many relation between two classes;
  • You cannot define a many-to-many relation between a class and itself;
  • All() will eagerly load all objects, which is memory expensive.