2015-09-17 2 views
0

Я обновляюсь с Symfony 1.4 до Symfony 2.6.4 и не могу понять, как настроить поле формы для хранения набора вариантов (кажется достаточно простым) из сохраненного объекта. Я получаю сообщение об ошибке при создании моей схемы.Ошибка настройки поля для хранения массива флажков

Код:

<?php 

namespace PlantBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 

class PlantForm extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 

     $builder->add('propagationMethod', 'entity', array(
      'class'   => 'PlantBundle:PropagationMethod', 
      'property'  => 'name', 
      'expanded'  => true, 
      'multiple'  => true, 
      'required'  => false, 
      'label'   => 'Propagation Methods', 
      'attr'   => array(
       'class' => 'checkboxes' 
     ))); 
    } 
} 


<?php 

namespace PlantBundle\Entity; 
use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 


/** 
* @ORM\Entity(repositoryClass="PlantBundle\Entity\Repository\PlantRepository") 
* @ORM\Table(name="plant") 
* @ORM\HasLifecycleCallbacks 
*/ 
class Plant 
{ 
# ... 

    /** 
    * @ORM\Column(type="array", nullable=true) 
    */ 
    protected $propagationMethodIds; 

    /** 
    * @ORM\ManyToOne(targetEntity="PlantBundle\Entity\PropagationMethod") 
    * @ORM\JoinColumn(name="propagationMethodIds", referencedColumnName="id") 
    */ 
    protected $propagationMethod;  

# ... 
    public function __construct() 
    { 
     $this->propagationMethod = new ArrayCollection(); 
    } 

# ... 
} 

Сообщение об ошибке при создании схемы:

[PDOException]
SQLSTATE [42000]: Синтаксическая ошибка или нарушение прав доступа: 1170 BLOB/TEXT столбец 'propagationMethodIds' используется в ключевая спецификация без длины ключа

Я попытался добавить длину = 255 в поле, но все равно получить ошибку. Из исследования, которое я предпринял для устранения неполадки, кажется, что поле индексируется, и поскольку это капля, ему требуется указанная длина. Но поле представляет собой массив идентификаторов из связанной таблицы. Confused:/

ответ

0

После многих поисков и экспериментов я нашел решение, которое работает. Поскольку документации нет, и ответов на этот вопрос не было, я не знаю, является ли это правильным или наилучшим способом достижения желаемого результата, но, как я уже упоминал, он работает. Я предлагаю решение здесь в надежде, что это поможет другим застрять в этом вопросе.

<?php 

// Correct. No changes needed. 

namespace PlantBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 

class PlantForm extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 

     $builder->add('propagationMethod', 'entity', array(
      'class'   => 'PlantBundle:PropagationMethod', 
      'property'  => 'name', 
      'expanded'  => true, 
      'multiple'  => true, 
      'required'  => false, 
      'label'   => 'Propagation Methods', 
      'attr'   => array(
       'class' => 'checkboxes' 
     ))); 
    } 
} 


<?php 

namespace PlantBundle\Entity; 
use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 


/** 
* @ORM\Entity(repositoryClass="PlantBundle\Entity\Repository\PlantRepository") 
* @ORM\Table(name="plant") 
* @ORM\HasLifecycleCallbacks 
*/ 
class Plant 
{ 
# ... 

/* 
* This column is not needed at all. It creates all kinds of problems by keeping it. Delete: 
* 
* /** 
*  * @ORM\Column(type="array", nullable=true) 
*  */ 
* protected $propagationMethodIds; 
* 
*/ 

// Add the column type above to the ORM mapping below. Also remove the name association on the JoinColumn. 

    /** 
    * @ORM\Column(type="array", nullable=true) 
    * @ORM\ManyToOne(targetEntity="PlantBundle\Entity\PropagationMethod") 
    * @ORM\JoinColumn(referencedColumnName="id") 
    */ 
    protected $propagationMethod;  

// Correct. No changes:  

# ... 
    public function __construct() 
    { 
     $this->propagationMethod = new ArrayCollection(); 
    } 

# ... 
} 

/* 
* This is how I displayed the stored array data: 
* 
*/ 


// show.html.twig 

{% extends 'PlantBundle::layout.html.twig' %} 
{% block stylesheets %} 
    {{ parent() }} <link href="{{ asset('bundles/~/plant.css') }}" type="text/css" rel="stylesheet" /> 
{% endblock %} 
{% block title %}Plant Details{% endblock%} 
{% block body %} 
    {% for method in plant.propagationMethod %}{{ method.name }} {% endfor %} 
{% endblock %}