Skip to content
This repository has been archived by the owner on Dec 25, 2020. It is now read-only.

ActiveRecord

Kerem Güneş edited this page Apr 8, 2017 · 10 revisions

ActiveRecord aims to simplify CRUD operations providing entity objects.

Simple define a class that extends Oppa\ActiveRecord\ActiveRecord.

use Oppa\ActiveRecord\ActiveRecord;

class Users extends ActiveRecord {
    protected $table = 'users';
    protected $tablePrimary = 'id';
}

// init ar object
$users = new Users($db);

// find one that id=1
$user = $users->find(1);

// check user found?
if ($user->isFound()) {
    print $user->name;
}

** Fetching objects.

// find all
$users = $users->findAll();
// find many that id=1,2,3
$users = $users->findAll([1,2,3]);
$users = $users->findAll('id in(?)', [[1,2,3]]);
$users = $users->findAll('id in(?,?,?)', [1,2,3]);
dump $users;

foreach ($users as $user) {
    print $user->name;
}

// not found
$users = $users->findAll([-1,null,'foo']);
dump $users->isEmpty(); // true

** Inserting an object.

// insert a user
$user = $users->entity();
$user->name = 'Ali';
$user->old  = 40;
dump $user->save();
// or
$user = $users->save($user);
// here we will see "id" property filled with last insert id
dump $user;

** Updating an object.

// update a user with "id=1"
$user = $users->entity();
$user->id  = 1; // set primary value
$user->old = 55;
dump $users->save($user);

// or
$user = $users->find(1);
$user->old = 55;
dump $user->save();

** Removing an object.

$user = $users->find(1);
if ($user->isFound()) {
    dump $user->remove();
}
// or
$user = $users->entity();
$user->id = 1;
dump $user->remove();


// remove users "id=1,2,3"
dump $users->removeAll([1,2,3]);

Working with on helpers

You can also work with helper methods like onFind, onSave and onRemove.

class Users extends ActiveRecord {
    protected $table = 'users';
    protected $tablePrimary = 'id';

    public function onFind(\Oppa\Query\Builder $query) {
        // do something with query builder object
        return $query->joinLeft('user_score', 'user_score.user_id = user.id')
            ->selectMore('sum(user_score.score) as score');
    }

    public function onSave($result) {
        // if insert: last insert id 
        // if update: affected rows
        dump $result; 
    }

    public function onRemove($result) {
        // affected rows
        dump $result; 
    }
}

$user = (new Users($db))->find(1);
print $user->score; 

print_r($user);
// Oppa\ActiveRecord\Entity Object
// (
//     [data:private] => Array
//         (
//             [id] => 1
//             [name] => Kerem
//             [score] => 30
//             [login] => 2015-01-12 20:00:52
//         )
//     ...

Defining object methods

You can define helper (shorcut) methods in your objects and all these methods will be bound returning entity objects.

class Users extends ActiveRecord {
    protected $table = 'users';
    protected $tablePrimary = 'id';

    public function onEntity($entity) {
        $entity->addMethod('getFullName', function() {
            return sprintf('%s %s', $this->first_name, $this->last_name);
        });
        $entity->addMethod('getUserLink', function() {
            return sprintf('<a href="user.php?id=%s">%s</a>', 
                $this->id, $this->getFullName());
        });
    }
}

$user = (new Users($db))->find(1);
print $user->getFullName(); // Kerem Güneş
print $user->getUserLink(); // <a href="user.php?id=1">Kerem Güneş</a>

Create new entity

$user = $users->entity();
$user = $users->entity(['id' => 1, ...]);

Add data to entity

$user->setData(['id' => 1, ...]);

Get entity data as array|object

$data = $user->toArray();
$data = $user->toObject();
Clone this wiki locally