2017 © Pedro Peláez
 

yii2-extension yii2-pgsql-enum

Enum type behavior and helper for Yii2, for PostgreSQL only

image

tigrov/yii2-pgsql-enum

Enum type behavior and helper for Yii2, for PostgreSQL only

  • Wednesday, May 2, 2018
  • by Tigros
  • Repository
  • 1 Watchers
  • 0 Stars
  • 178 Installations
  • PHP
  • 1 Dependents
  • 0 Suggesters
  • 0 Forks
  • 0 Open issues
  • 4 Versions
  • 3 % Grown

The README.md

yii2-pgsql-enum

Enum type behavior and helper for Yii2, for PostgreSQL only., (*1)

Using enum types provides good readability of data in DataBase without spending extra resources on the storage of duplicate values (in cases with any string types)., (*2)

Such types are more difficult to maintain in a project. This extension helps to simplify the use of enum types., (*3)

Latest Stable Version Build Status, (*4)

Limitation

Since 1.1.0 requires PHP >= 5.5, (*5)

For method renameValue() requires PostgreSQL >= 10.0, (*6)

Installation

The preferred way to install this extension is through composer., (*7)

Either run, (*8)

php composer.phar require --prefer-dist tigrov/yii2-pgsql-enum

or add, (*9)

"tigrov/yii2-pgsql-enum": "~1.0"

to the require section of your composer.json file., (*10)

Usage

Once the extension is installed, you can create new enum types as follow:, (*11)

class NewEnum extends \tigrov\pgsql\enum\EnumBehavior
{
    /** @var array list of attributes that are to be automatically humanized value */
    public $attributes = ['type' => 'type_key'];
}

Create a table with the enum type, (*12)

// Create the enum in DB or in PHP code 
NewEnum::create(['value1', 'value2', 'value3']);

\Yii::$app->getDb()->createCommand()
    ->createTable('model', [
       'id' => 'pk',
       'type_key' => NewEnum::typeName(), // 'new_enum'
   ])->execute();

Create a model for the table, (*13)

class Model extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            NewEnum::class,
            // 'type' => [
            //    'class' => NewEnum::class,
            //    'attributes' => ['type' => 'type_key'],
            //],
        ];
    }

    /**
     * @inheritdoc
     */
    public function save($runValidation = true, $attributeNames = null)
    {
        // You can add new values if they are not exists in the enum type
        try {
            return parent::save($runValidation, $attributeNames);
        } catch (\yii\db\Exception $e) {
            NewEnum::add($this->type_key);
            return parent::save($runValidation, $attributeNames);
        }
    }
}

and then use them in your code, (*14)

/**
 * @var ActiveRecord $model
 */
$model = new Model;
$model->type_key = 'value1';
$model->save();

$newModel = Model::findOne($model->id);
$newModel->type_key === 'value1';
$newModel->type === 'Value1'; // see yii\helpers\Inflector::humanize($word, true)

// The extension will try to add a new value if it does not exist
$model->type_key = 'non-existent value';
$model->save();

// To get all enum values in [value => humanized value] array notation
NewEnum::values();

// To get all enum values without humanized values in [value1, value2, ...] array notation
NewEnum::codes();

// To add a new value to the enum type
NewEnum::add('new value');

// To get a humanized value
NewEnum::value('new value'); // returns "New Value" or translated value

// To check if the enum type has a value
NewEnum::has('new value');

// To rename a value of the enum type
NewEnum::renameValue('new value', 'renamed value');

// To remove a value from the enum type
NewEnum::remove('renamed value');

// To check if the enum type exists
NewEnum::exists();

// To drop the enum type
NewEnum::drop();

Examples

Gender codes:, (*15)

class GenderCode extends \tigrov\pgsql\enum\EnumBehavior
{
    /**
     * @var array list of attributes that are to be automatically humanized value.
     * humanized => original attribute
     */
    public $attributes = ['gender' => 'gender_code'];

    /**
     * Values of genders
     * @param bool $withEmpty with empty value at first
     * @return array
     */
    public static function values($withEmpty = false)
    {
        return ($withEmpty ? ['' => static::emptyValue()] : []) + [
            'M' => \Yii::t('enum', 'Male'),
            'F' => \Yii::t('enum', 'Female'),
        ];
    }
}

class Model extends \yii\db\ActiveRecord
{
    public function behaviors()
    {
        return [
            GenderCode::class,
        ];
    }
}

$model->gender_code = 'M';
$model->gender === 'Male'; // or translated value

Messenger names:, (*16)

class MessengerType extends \tigrov\pgsql\enum\EnumBehavior
{
    /** @var array list of attributes that are to be automatically humanized value */
    public $attributes = ['type' => 'type_key'];

    /**
     * Values of Messengers
     * @param bool $withEmpty with empty value at first
     * @return array
     */
    public static function values($withEmpty = false)
    {
        return ($withEmpty ? ['' => static::emptyValue()] : []) + [
            'skype' => 'Skype',
            'whatsapp' => 'WhatsApp',
            'viber' => 'Viber',
            'facebook' => 'Facebook',
            'imessage' => 'iMessage',
            'telegram' => 'Telegram',
            'line' => 'Line',
            'jabber' => 'Jabber',
            'qq' => 'QQ',
            'blackberry' => 'BlackBerry',
            'aim' => 'AIM',
            'ebuddy' => 'eBuddy',
            'yahoo' => 'Yahoo',
            'other' => \Yii::t('enum', 'Other'),
        ];
    }
}

$model->type_key = 'whatsapp';
$model->type === 'WhatsApp';

Translate values:, (*17)

class TranslatableType extends \tigrov\pgsql\enum\EnumBehavior
{
    public static $messageCategory = 'app';
}

// $model->type is translated value
// TranslatableType::values() are all translated values

Type values as constants:, (*18)

class Status extends \tigrov\pgsql\enum\EnumBehavior
{
    const ACTIVE = 'active';
    const PENDING = 'pending';
    const REJECTED = 'rejected';
    const DELETED = 'deleted';

    public $attributes = ['status' => 'status_key'];
    public static $messageCategory = 'status';
}

// Do not forget to initialize the enum type in the database
// E.g. Status::create();

$model->status_key = Status::PENDING;
$model->status === 'Pending'; // or translated value

License

MIT, (*19)

The Versions

02/05 2018

dev-master

9999999-dev

Enum type behavior and helper for Yii2, for PostgreSQL only

  Sources   Download

MIT

The Requires

 

by Sergei Tigrov

extension postgresql postgres yii2 enum pgsql

02/05 2018

1.2.0

1.2.0.0

Enum type behavior and helper for Yii2, for PostgreSQL only

  Sources   Download

MIT

The Requires

 

by Sergei Tigrov

extension postgresql postgres yii2 enum pgsql

01/03 2018

1.1.0

1.1.0.0

Enum type behavior and helper for Yii2, for PostgreSQL only

  Sources   Download

MIT

The Requires

 

by Sergei Tigrov

extension postgresql postgres yii2 enum pgsql

30/05 2017

1.0.0

1.0.0.0

Enum type behavior and helper for Yii2, for PostgreSQL only

  Sources   Download

MIT

The Requires

 

by Sergei Tigrov

extension postgresql postgres yii2 enum pgsql