5   Repository

5.1   About the repository

The repository is the link between your entity object and your database, through the Query object.

It also bear the responsibility to intialize Metadata related to your entity, to learn how to map your database object.

5.2   Creating Metadata

As an example speaks louder than words:

use CCMBenchmark\Ting\Repository\Repository;
use CCMBenchmark\Ting\Serializer\SerializerFactoryInterface;
use CCMBenchmark\Ting\Repository\MetadataInitializer;

class SampleRepository extends Repository implements MetadataInitializer
{
    public static function initMetadata(SerializerFactoryInterface $serializerFactory, array $options = [])
    {
        $metadata = new Metadata($serializerFactory);

        $metadata->setEntity(Sample\Model\City::class);
        $metadata->setConnectionName('main');
        $metadata->setDatabase('world');
        $metadata->setTable('t_city_cit');

        $metadata
            ->addField([
                'primary'       => true,
                'autoincrement' => true,
                'fieldName'     => 'id',
                'columnName'    => 'cit_id',
                'type'          => 'int'
            ])
            ->addField([
                'fieldName'  => 'name',
                'columnName' => 'cit_name',
                'type'       => 'string'
            ])
            ->addField([
                'fieldName'  => 'capitalCity',
                'columnName' => 'capital_city',
                'type'       => 'bool',
                'getter'     => 'isCapitalCity',
                'setter'     => 'capitalCityIs'
            ]);

        return $metadata
    }
Some details:
  • fieldName is the name of the property of your entity
  • columnName is the name of the column in your database
  • type is the type of your variable; among one of the following :
    • int
    • double
    • string
    • bool
    • datetime
    • json

The types bool, datetime and json are a bit special because they are dependent of database so they can be serialized / deserialized with some options:

Note

Available since version 3.2

  • the getter key allows to change name of the getter, by default it is getFieldName
  • the setter key allows to change name of the setter, by default it is setFieldName

Note

Available since version 3.4 only with the Pgsql driver

  • sequenceName allows to choose which sequence to use to retrieve the autoincrement value

5.3   Serializer

5.3.1   About the serializer

Serialization is the operation which transforms PHP data into understandable data for RDBMS. The reverse operation is called unserialization

Serializer allow complex type management like bool, datetime and json.

The boolean type is considered a complex type, because the way they are stored in the database differs depending on each RDBMS
  • CCMBenchmark\Ting\Driver\Pgsql\Serializer\Boolean
  • CCMBenchmark\Ting\Driver\Mysqli\Serializer\Boolean

The datetime type is considered as complex because it transform DateTime object into understandable format by RDBMS

The json type is complex because it translate data array into string understandable by RDBMS

5.3.2   Serializer configuration

Serializer is configured by serializer_options key

addField([
    'fieldName'          => 'tags',
    'columnName'         => 'tags_name',
    'type'               => 'json',
    'serializer_options' => [
        'unserialize' => ['assoc' => true]
    ]
]);

Please take a look at the source code of each Serializer to see available options.

5.3.3   Writing a serializer

You can write your own serializers and inject it into the repository definition by using serializer key

The serializer must implements interface CCMBenchmark\Ting\Serializer\SerializeInterface and/or CCMBenchmark\Ting\Serializer\UnserializeInterface. If you want implents both interfaces, you must use CCMBenchmark\Ting\Serializer\SerializerInterface

The interface CCMBenchmark\Ting\Serializer\SerializeInterface transform a value into a data understandable by DMBS. The interface CCMBenchmark\Ting\Serializer\UnserializeInterface authorize the reverse operation

addField([
    'fieldName'  => 'tags',
    'columnName' => 'tags_name',
    'type'       => 'json',
    'serializer' => Bouh\Awesome\Serializer::class
]);

5.4   QueryBuilder

We can need chaining queries, a QueryBuilder can be used. Ting provide it through aura/sqlquery.

$repository->getQueryBuilder(Repository::QUERY_SELECT);

or

$repository->getQueryBuilder(Repository::QUERY_INSERT);

or

$repository->getQueryBuilder(Repository::QUERY_UPDATE);

or

$repository->getQueryBuilder(Repository::QUERY_DELETE);

Documentation available on https://github.com/auraphp/Aura.SqlQuery

5.5   Queries

The Repository provides several methods to perform common queries easily.

5.5.1   Find an object by it’s primary key

$repository->get(3)

5.5.2   All items

$repository->getAll()

5.5.3   An object according to one or more properties of the model

$repository->getOneBy(['propertyName' => 'Sylvain']);

5.5.4   An object collection, according to one or more properties of the model

$repository->getBy(['propertyName' => 'Sylvain']);