lesha888/doctrine-set-type-bundle

Provides support of MySQL SET type for Doctrine2 in Symfony2 applications.

Installs: 23

Dependents: 0

Suggesters: 0

Security: 0

Stars: 0

Watchers: 2

Forks: 10

Type:symfony-bundle

v0.3.0 2015-04-28 15:20 UTC

This package is auto-updated.

Last update: 2024-04-05 03:23:30 UTC


README

The DoctrineSetTypeBundle provides support MySQL SET type for Doctrine2 in your Symfony2 application.

Latest Stable Version Build Status Scrutinizer Code Quality Code Coverage

License

Features

  • SET type mapping
  • SET type validation
  • Doctrine migrations

Requirements

  • PHP 5.5+
  • Symfony 2.5+
  • Doctrine 2.2+

Supported platforms

  • MySQL

Installation

Step 1: Download the Bundle

Using composer

$ composer require okapon/doctrine-set-type-bundle "0.2.0"

Step 2: Enable the Bundle

Then, enable the bundle by adding the following line in the app/AppKernel.php file of your project:

<?php
// app/AppKernel.php

// ...
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...

            new Okapon\DoctrineSetTypeBundle\OkaponDoctrineSetTypeBundle(),
        );

        // ...
    }

    // ...
}

Step 3: Enable the mapping_type

In order to use MySQL SET type, Add the following line in the app/config/confing.yml

doctrine:
    dbal:
        mapping_types:
            set: string

Usage

Create your SET type class

Sample: UserGroupType class

This class is Sample that user has multiple groups which is mysql set type.

Then, create UserGroupType and extend AbstractSetType.

<?php

namespace AppBundle\DBAL\Types;

use Okapon\DoctrineSetTypeBundle\DBAL\Types\AbstractSetType;

class UserGroupType extends AbstractSetType
{
    const GROUP1 = 'group1';
    const GROUP2 = 'group2';
    const GROUP3 = 'group3';

    /**
     * {@inheritdoc}
     */
     protected $name = 'UserGroupType'; // This is Optional. Automatically registered shord class name.

    /**
     * define your SET type.
     */
    protected static $choices = [
        self::GROUP1 => 'Group 1',
        self::GROUP2 => 'Group 2',
        self::GROUP3 => 'Group 3',
    ];
}

Register your type

Register UserGroupType in config.yml

doctrine:
    dbal:
        ## ...
        types:
            UserGroupType: AppBundle\DBAL\Types\UserGroupType

Add mapping data to entity

This is annotaion sample.

<?php

namespace AppBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;
use Okapon\DoctrineSetTypeBundle\Validator\Constraints as DoctrineAssert;
use AppBundle\DBAL\Types\UserGroupType;

/**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity
 */
class User
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="username", type="string", length=50)
     */
    private $username;

    /**
     * @var array
     *
     * @DoctrineAssert\SetType(class="AppBundle\DBAL\Types\UserGroupType")
     * @ORM\Column(name="groups", type="UserGroupType", nullable=true) // mapping_type
     */
    private $groups;

    // ...

    /**
     * Set groups
     *
     * @param array $groups
     * @return User
     */
    public function setGroups(array $groups)
    {
        $this->groups = $groups;

        return $this;
    }

    /**
     * Get groups
     *
     * @return array
     */
    public function getGroups()
    {
        return $this->groups;
    }
}

You can set Groups with array to User entity

$user->setGroups([UserGroupType::GROUP1, UserGroupType::GROUP2]);

And also You can validate your type by adding the following annotation.

    /**
     * @DoctrineAssert\SetType(class="AppBundle\DBAL\Types\UserGroupType")
     */
    private $groups;

Building the form

Input null to the Second argument.

SetTypeGuesser render the field as checkboxes.

$builder->add('groups', null, [
    'choices' => UserGroupType::getChoices()
    'required' => true,
]);

Doctrine migrations

Following SQL is executed.

CREATE TABLE user (
    id INT AUTO_INCREMENT NOT NULL,
    username varchar(50) COLLATE utf8_unicode_ci NOT NULL,
    groups set('group1','group2') DEFAULT NULL COMMENT '(DC2Type:UserGroupType)',
    PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB