2017 © Pedro Peláez
 

library sql

Build complex data structures from relational databases

image

psx/sql

Build complex data structures from relational databases

  • Wednesday, July 11, 2018
  • by k42b3
  • Repository
  • 1 Watchers
  • 2 Stars
  • 16,643 Installations
  • PHP
  • 2 Dependents
  • 0 Suggesters
  • 1 Forks
  • 0 Open issues
  • 22 Versions
  • 12 % Grown

The README.md

Sql

This library generates type-safe PHP classes from your database tables and thus allows you to interact with your database in a complete type-safe way., (*1)

About

In traditional ORMs you write a class add specific metadata and generate based on this class your tables, this means our source code defines how a table should look. This library thinks the other way around (database first), this means you first build your database schema i.e. through a tool like doctrine migrations and then you can use this library to automatically generate all repository and model classes based on the table schema. This has the great advantage that we can generate completely typed repositories. We automatically generate a class for each row (entity) and a repository which accepts this row. This concept is not new and the Java world has i.e. jOOQ which also follows this idea. It of course means also that you need to regenerate your classes if you change your schema., (*2)

Generate

To generate the table and row classes you can either integrate the PSX\Command\GenerateCommand into your Symfony console app or you can also do this programmatically through the PSX\Sql\Generator class s., (*3)

<?php

use PSX\Sql\Generator\Generator;

$connection   = null; // a doctrine DBAL connection
$target = __DIR__;

$generator = new Generator($connection, 'Acme\\Table');
foreach ($generator->generate() as $className => $source) {
    file_put_contents($target . '/' . $className . '.php', '<?php' . "\n\n" . $source);
}

Basic usage

The following are basic examples how you can work with a generated table class., (*4)

<?php

use PSX\Sql\Condition;
use PSX\Sql\OrderBy;
use PSX\Sql\TableManager;

$connection   = null; // a doctrine DBAL connection
$tableManager = new TableManager($connection);

/** @var \PSX\Sql\Tests\Generator\SqlTableTestTable $table */
$table = $tableManager->getTable(\PSX\Sql\Tests\Generator\SqlTableTestTable::class);

// returns by default 16 entries from the table ordered by the primary column descending
$table->findAll();

// returns 12 entries starting at index 0
$table->findAll(startIndex: 0, count: 12);

// orders the entries after the column "id" descending
$table->findAll(startIndex: 0, count: 12, sortBy: 'id', sortOrder: OrderBy::DESC);

// returns all rows which match the specified title
$table->findByTitle('foo%');

// returns a row by the primary key
$table->find(1);

// returns the count of entries in the table. It is also possible to provide a condition
$table->getCount();

// creates a new row
$row = new \PSX\Sql\Tests\Generator\SqlTableTestRow();
$row->setTitle('foo');
$table->create($row);

// updates a row
$row = $table->find(1);
$row->setTitle('bar');
$table->update($row);

// deletes a row
$row = $table->find(1);
$table->delete($row);

Table

The following is an example of a generated table class., (*5)

<?php

namespace PSX\Sql\Tests\Generator;

/**
 * @extends \PSX\Sql\TableAbstract<\PSX\Sql\Tests\Generator\SqlTableTestRow>
 */
class SqlTableTestTable extends \PSX\Sql\TableAbstract
{
    public const NAME = 'psx_sql_table_test';
    public const COLUMN_ID = 'id';
    public const COLUMN_TITLE = 'title';
    public const COLUMN_DATE = 'date';
    public function getName() : string
    {
        return self::NAME;
    }
    public function getColumns() : array
    {
        return array(self::COLUMN_ID => 0x3020000a, self::COLUMN_TITLE => 0xa00020, self::COLUMN_DATE => 0x800000);
    }
    /**
     * @return array<\PSX\Sql\Tests\Generator\SqlTableTestRow>
     * @throws \PSX\Sql\Exception\QueryException
     */
    public function findAll(?\PSX\Sql\Condition $condition = null, ?int $startIndex = null, ?int $count = null, ?string $sortBy = null, ?\PSX\Sql\OrderBy $sortOrder = null) : array
    {
        return $this->doFindAll($condition, $startIndex, $count, $sortBy, $sortOrder);
    }
    /**
     * @return array<\PSX\Sql\Tests\Generator\SqlTableTestRow>
     * @throws \PSX\Sql\Exception\QueryException
     */
    public function findBy(\PSX\Sql\Condition $condition, ?int $startIndex = null, ?int $count = null, ?string $sortBy = null, ?\PSX\Sql\OrderBy $sortOrder = null) : array
    {
        return $this->doFindBy($condition, $startIndex, $count, $sortBy, $sortOrder);
    }
    /**
     * @throws \PSX\Sql\Exception\QueryException
     */
    public function findOneBy(\PSX\Sql\Condition $condition) : ?\PSX\Sql\Tests\Generator\SqlTableTestRow
    {
        return $this->doFindOneBy($condition);
    }
    /**
     * @throws \PSX\Sql\Exception\QueryException
     */
    public function find(int $id) : ?\PSX\Sql\Tests\Generator\SqlTableTestRow
    {
        $condition = \PSX\Sql\Condition::withAnd();
        $condition->equals('id', $id);
        return $this->doFindOneBy($condition);
    }
    /**
     * @return array<\PSX\Sql\Tests\Generator\SqlTableTestRow>
     * @throws \PSX\Sql\Exception\QueryException
     */
    public function findById(int $value, ?int $startIndex = null, ?int $count = null, ?string $sortBy = null, ?\PSX\Sql\OrderBy $sortOrder = null) : array
    {
        $condition = \PSX\Sql\Condition::withAnd();
        $condition->equals('id', $value);
        return $this->doFindBy($condition, $startIndex, $count, $sortBy, $sortOrder);
    }
    /**
     * @throws \PSX\Sql\Exception\QueryException
     */
    public function findOneById(int $value) : ?\PSX\Sql\Tests\Generator\SqlTableTestRow
    {
        $condition = \PSX\Sql\Condition::withAnd();
        $condition->equals('id', $value);
        return $this->doFindOneBy($condition);
    }
    /**
     * @throws \PSX\Sql\Exception\ManipulationException
     */
    public function updateById(int $value, \PSX\Sql\Tests\Generator\SqlTableTestRow $record) : int
    {
        $condition = \PSX\Sql\Condition::withAnd();
        $condition->equals('id', $value);
        return $this->doUpdateBy($condition, $record->toRecord());
    }
    /**
     * @throws \PSX\Sql\Exception\ManipulationException
     */
    public function deleteById(int $value) : int
    {
        $condition = \PSX\Sql\Condition::withAnd();
        $condition->equals('id', $value);
        return $this->doDeleteBy($condition);
    }
    /**
     * @return array<\PSX\Sql\Tests\Generator\SqlTableTestRow>
     * @throws \PSX\Sql\Exception\QueryException
     */
    public function findByTitle(string $value, ?int $startIndex = null, ?int $count = null, ?string $sortBy = null, ?\PSX\Sql\OrderBy $sortOrder = null) : array
    {
        $condition = \PSX\Sql\Condition::withAnd();
        $condition->like('title', $value);
        return $this->doFindBy($condition, $startIndex, $count, $sortBy, $sortOrder);
    }
    /**
     * @throws \PSX\Sql\Exception\QueryException
     */
    public function findOneByTitle(string $value) : ?\PSX\Sql\Tests\Generator\SqlTableTestRow
    {
        $condition = \PSX\Sql\Condition::withAnd();
        $condition->like('title', $value);
        return $this->doFindOneBy($condition);
    }
    /**
     * @throws \PSX\Sql\Exception\ManipulationException
     */
    public function updateByTitle(string $value, \PSX\Sql\Tests\Generator\SqlTableTestRow $record) : int
    {
        $condition = \PSX\Sql\Condition::withAnd();
        $condition->like('title', $value);
        return $this->doUpdateBy($condition, $record->toRecord());
    }
    /**
     * @throws \PSX\Sql\Exception\ManipulationException
     */
    public function deleteByTitle(string $value) : int
    {
        $condition = \PSX\Sql\Condition::withAnd();
        $condition->like('title', $value);
        return $this->doDeleteBy($condition);
    }
    /**
     * @return array<\PSX\Sql\Tests\Generator\SqlTableTestRow>
     * @throws \PSX\Sql\Exception\QueryException
     */
    public function findByDate(\PSX\DateTime\LocalDateTime $value, ?int $startIndex = null, ?int $count = null, ?string $sortBy = null, ?\PSX\Sql\OrderBy $sortOrder = null) : array
    {
        $condition = \PSX\Sql\Condition::withAnd();
        $condition->equals('date', $value);
        return $this->doFindBy($condition, $startIndex, $count, $sortBy, $sortOrder);
    }
    /**
     * @throws \PSX\Sql\Exception\QueryException
     */
    public function findOneByDate(\PSX\DateTime\LocalDateTime $value) : ?\PSX\Sql\Tests\Generator\SqlTableTestRow
    {
        $condition = \PSX\Sql\Condition::withAnd();
        $condition->equals('date', $value);
        return $this->doFindOneBy($condition);
    }
    /**
     * @throws \PSX\Sql\Exception\ManipulationException
     */
    public function updateByDate(\PSX\DateTime\LocalDateTime $value, \PSX\Sql\Tests\Generator\SqlTableTestRow $record) : int
    {
        $condition = \PSX\Sql\Condition::withAnd();
        $condition->equals('date', $value);
        return $this->doUpdateBy($condition, $record->toRecord());
    }
    /**
     * @throws \PSX\Sql\Exception\ManipulationException
     */
    public function deleteByDate(\PSX\DateTime\LocalDateTime $value) : int
    {
        $condition = \PSX\Sql\Condition::withAnd();
        $condition->equals('date', $value);
        return $this->doDeleteBy($condition);
    }
    /**
     * @throws \PSX\Sql\Exception\ManipulationException
     */
    public function create(\PSX\Sql\Tests\Generator\SqlTableTestRow $record) : int
    {
        return $this->doCreate($record->toRecord());
    }
    /**
     * @throws \PSX\Sql\Exception\ManipulationException
     */
    public function update(\PSX\Sql\Tests\Generator\SqlTableTestRow $record) : int
    {
        return $this->doUpdate($record->toRecord());
    }
    /**
     * @throws \PSX\Sql\Exception\ManipulationException
     */
    public function updateBy(\PSX\Sql\Condition $condition, \PSX\Sql\Tests\Generator\SqlTableTestRow $record) : int
    {
        return $this->doUpdateBy($condition, $record->toRecord());
    }
    /**
     * @throws \PSX\Sql\Exception\ManipulationException
     */
    public function delete(\PSX\Sql\Tests\Generator\SqlTableTestRow $record) : int
    {
        return $this->doDelete($record->toRecord());
    }
    /**
     * @throws \PSX\Sql\Exception\ManipulationException
     */
    public function deleteBy(\PSX\Sql\Condition $condition) : int
    {
        return $this->doDeleteBy($condition);
    }
    /**
     * @param array<string, mixed> $row
     */
    protected function newRecord(array $row) : \PSX\Sql\Tests\Generator\SqlTableTestRow
    {
        return \PSX\Sql\Tests\Generator\SqlTableTestRow::from($row);
    }
}

Row

The following is an example of a generated table row., (*6)

<?php

namespace PSX\Sql\Tests\Generator;

class SqlTableTestRow implements \JsonSerializable, \PSX\Record\RecordableInterface
{
    private ?int $id = null;
    private ?string $title = null;
    private ?\PSX\DateTime\LocalDateTime $date = null;
    public function setId(int $id) : void
    {
        $this->id = $id;
    }
    public function getId() : int
    {
        return $this->id;
    }
    public function setTitle(string $title) : void
    {
        $this->title = $title;
    }
    public function getTitle() : string
    {
        return $this->title;
    }
    public function setDate(\PSX\DateTime\LocalDateTime $date) : void
    {
        $this->date = $date;
    }
    public function getDate() : \PSX\DateTime\LocalDateTime
    {
        return $this->date;
    }
    public function toRecord() : \PSX\Record\RecordInterface
    {
        $record = new \PSX\Record\Record();
        $record->put('id', $this->id);
        $record->put('title', $this->title);
        $record->put('date', $this->date);
        return $record;
    }
    public function jsonSerialize() : object
    {
        return (object) $this->toRecord()->getAll();
    }
    public static function from(array|\ArrayAccess $data) : self
    {
        $row = new self();
        $row->id = $data['id'] ?? null;
        $row->title = $data['title'] ?? null;
        $row->date = isset($data['date']) ? \PSX\DateTime\LocalDateTime::from($data['date']) : null;
        return $row;
    }
}

The Versions

11/07 2018

dev-master

9999999-dev http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

11/07 2018

v2.1.2

2.1.2.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

31/12 2017

v2.1.1

2.1.1.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

02/11 2017

v2.1.0

2.1.0.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

01/07 2017

v2.0.6

2.0.6.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

01/07 2017

v2.0.5

2.0.5.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

13/03 2017

v2.0.4

2.0.4.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

12/03 2017

v2.0.3

2.0.3.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

06/03 2017

v2.0.2

2.0.2.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

05/03 2017

v2.0.1

2.0.1.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

22/12 2016

v2.0.0

2.0.0.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

30/10 2016

v1.0.7

1.0.7.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

13/10 2016

v1.0.6

1.0.6.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

04/07 2016

v1.0.5

1.0.5.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

12/06 2016

v1.0.4

1.0.4.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

09/06 2016

v1.0.3

1.0.3.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

01/06 2016

v1.0.2

1.0.2.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

16/05 2016

v1.0.1

1.0.1.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

08/05 2016

v1.0.0

1.0.0.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

07/05 2016

v0.1.2

0.1.2.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

03/04 2016

v0.1.1

0.1.1.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql

02/04 2016

v0.1.0

0.1.0.0 http://phpsx.org

Build complex data structures from relational databases

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

sql