1. Go to this page and download the library: Download djinorm/djin library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
djinorm / djin example snippets
use DjinORM\Djin\Id\Id;
use DjinORM\Djin\Model\ModelInterface;
class User implements ModelInterface {
/** @var Id */
private $id;
/** @var string */
private $name;
public function __construct(string $name)
{
//Обратите внимание, мы создаем новый, пустой Id. Конкретное значение ему мы присвоим позже
$this->id = new Id();
$this->name = $name;
}
/**
* Реализацию данного метода требует ModelInterface
* @return Id
*/
public function getId(): Id
{
return $this->id;
}
public function getName(): string
{
return $this->name;
}
/**
* Реализацию данного метода требует ModelInterface
* @return string
*/
public static function getModelName() : string
{
return 'user';
}
}
use DjinORM\Djin\Id\Id;
use DjinORM\Djin\Model\ModelInterface;
class Comment implements ModelInterface {
/** @var Id */
private $id;
/** @var Id */
private $userId;
/** @var string */
private $text;
public function __construct(User $user, string $text)
{
$this->id = new Id();
$this->userId = $user->getId();
$this->text = $text;
}
/**
* Реализацию данного метода требует ModelInterface
* @return Id
*/
public function getId(): Id
{
return $this->id;
}
public function getUserId(): Id
{
return $this->userId;
}
public function getText(): string
{
return $this->text;
}
/**
* Реализацию данного метода требует ModelInterface
* @return string
*/
public static function getModelName() : string
{
return 'comment';
}
}
$user = new User('Timur');
$comment = new Comment($user, 'Hello world!');
use \DjinORM\Djin\Helpers\RepoHelper;
$user = new User('Timur');
$comment = new Comment($user, 'Hello world!');
$data = [
'id' => RepoHelper::getProperty($comment, 'id')->toScalar(),
'userId' => RepoHelper::getProperty($comment, 'userId')->toScalar(),
'text' => RepoHelper::getProperty($comment, 'text'),
];
use \DjinORM\Djin\Helpers\RepoHelper;
use \DjinORM\Djin\Id\Id;
$data = [
'id' => 1,
'userID' => 10,
'text' => 'Hello world!',
];
$comment = RepoHelper::newWithoutConstructor(Comment::class);
RepoHelper::setProperty($comment, 'id', new Id($data['id']));
RepoHelper::setProperty($comment, 'userId', new Id($data['userId']));
RepoHelper::setProperty($comment, 'text', $data['text']);
use DjinORM\Djin\Hydrator\Hydrator;
use DjinORM\Djin\Hydrator\Mappers\IdMapper;
use DjinORM\Djin\Hydrator\Mappers\StringMapper;
$userHydrator = new Hydrator(User::class, [
new IdMapper('id'),
new StringMapper('name'),
]);
$commentHydrator = new Hydrator(Comment::class, [
new IdMapper('id'),
new IdMapper('userId'),
new StringMapper('text'),
]);
use DjinORM\Djin\Hydrator\Hydrator;
use DjinORM\Djin\Hydrator\Mappers\IdMapper;
use DjinORM\Djin\Hydrator\Mappers\StringMapper;
class UserRepo implements \DjinORM\Djin\Repository\RepositoryInterface
{
const TABLE_NAME = 'users';
private $hydrator;
public function __construct()
{
$this->hydrator = new Hydrator(User::class, [
new IdMapper('id'),
new StringMapper('name'),
]);
}
public function findById($id) : ?ModelInterface
{
$sql = "SELECT * FROM {$this::TABLE_NAME} WHERE id = {$id}"; //Это лишь пример. Всегда используйте биндинги!
...
$data = some_function_that_fetch_data($sql);
//Здесь простой массив из базы будет превращен в объект User
$model = $this->hydrator->hydrate($data);
return $model;
}
...
public function insert(ModelInterface $model)
{
//Здесь модель будет превращена в обычный массив
$data = $this->hydrator->extract($model); //
some_function_make_insert_sql($data);
}
...
}
class CommentRepo implements \DjinORM\Djin\Repository\RepositoryInterface
{
const TABLE_NAME = 'comments';
private $hydrator;
public function __construct()
{
$this->hydrator = new Hydrator(Comment::class, [
new IdMapper('id'),
new IdMapper('userId'),
new StringMapper('text'),
]);
}
public function findById($id) : ?ModelInterface
{
$sql = "SELECT * FROM {$this::TABLE_NAME} WHERE id = {$id}"; //Это лишь пример. Всегда используйте биндинги!
...
$data = some_function_that_fetch_data($sql);
//Здесь простой массив из базы будет превращен в объект Comment
$model = $this->hydrator->hydrate($data);
return $model;
}
...
public function insert(ModelInterface $model)
{
//Здесь модель будет превращена в обычный массив
$data = $this->hydrator->extract($model); //
some_function_make_insert_sql($data);
}
...
}
$manager = new \DjinORM\Djin\Manager\ModelManager($container);
$manager->setModelRepository(UserRepo::class, User::class);
$manager->setModelRepository(CommentRepo::class, [Comment::class]);
$manager = new \DjinORM\Djin\Manager\ModelManager($container);
$manager->setModelRepository(UserRepo::class);
$manager->setModelRepository(CommentRepo::class);
$manager = new \DjinORM\Djin\Manager\ModelManager($container);
...
$user = new User('Timur');
$comment = new Comment($user, 'Hello world');
//Подготовит модели для сохранения в БД, но не запишет их в БД
$manager->persists([$user, $comment]);
//Если вдруг мы передумали сохранять модель, то можно вызвать метод delete(),
//который отменит сохранение новой, только что созданной модели, либо удалит
//уже существующую в базе модель
$manager->delete($comment);
//Достанет подготовленные для сохранения модели, вызовет методы репозиториев,
//проставляющие перманентные Id, выполнит onBeforeCommit, запишет модели
//в БД, и вызовет onAfterCommit или onCommitException в зависимости от результата
$manager->commit();
//Если же мы хотим найти какую-то модель, то мы можем сначала достать ее репозиторий
// несколькими способами. Напримр так
$userRepo = $manager->getModelRepository(User::class);
//или так
$userRepo = $manager->getModelRepository($user);
//или так
$userRepo = $manager->getRepositoryByModelName(User::getModelName());
//Находим пользователя. Это будет объект User
$user = $userRepo->findById(1);
//Изменяем пользователя
$user->setName('Anonim');
//Сохраняем изменения
$manager->persists($user);
$manager->commit();
//Удаляем пользователя. Вызов delete(), как и persists() не осуществляет запись в БД.
//Для фактического удаления модели из БД нужно вызвать commit();
$manager->delete($user);
//Реально удаляем запись из БД
$manager->commit();
use DjinORM\Djin\Id\Id;
use DjinORM\Djin\Model\ModelInterface;
use DjinORM\Djin\Model\Relation;
class Comment implements ModelInterface {
/** @var Id */
private $id;
/** @var Relation */
private $author;
/** @var string */
private $text;
public function __construct(ModelInterface $author, string $text)
{
$this->id = new Id();
$this->author = Relation::link($author);
$this->text = $text;
}
/**
* Реализацию данного метода требует ModelInterface
* @return Id
*/
public function getId(): Id
{
return $this->id;
}
public function getAuthor(): Relation
{
return $this->author;
}
public function getText(): string
{
return $this->text;
}
/**
* Реализацию данного метода требует ModelInterface
* @return string
*/
public static function getModelName() : string
{
return 'comment';
}
}