2012-04-11 3 views
0

Вот мой TagAdmin классполя не получать обновленные при использовании «sonata_type_model» ManyToMany отображение

protected function configureFormFields(FormMapper $formMapper) 
    { 
     $formMapper 
      ->add('name') 
      ->add('description') 
      ->add('slug','text',array( 
       'read_only' => true, 
      )) 
      ->add('categories', 'sonata_type_model', array('expanded' 
=> true, 'multiple' => true)); 
    } 

Существует manyToMany mapping между категориями и тегами.

Недавно я обновился до версии Sonata версии 2.0.

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

Единственное, что я сделал, это интегрировать флажок Chosen JQuery для обработки флажков. Я тоже попытался удалить это, , но он работает точно так же.

Что может быть не так?

Это класс меток.

class Tag 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
    /** 
    * @var string $name 
    * 
    * @Gedmo\Sluggable(slugField="slug") 
    * @ORM\Column(name="name", type="string", length=255) 
    * @Gedmo\Translatable 
    */ 
    private $name; 
    /** 
    * @var text $description 
    * 
    * @ORM\Column(name="description", type="text") 
    * @Gedmo\Translatable 
    */ 
    private $description; 
    /** 
    * @ORM\ManyToMany(targetEntity="Category", mappedBy="tags") 
    */ 
    protected $categories; 
    /** 
    * @var string $slug 
    * @Gedmo\Slug(updatable=false) 
    * @ORM\Column(name="slug", type="string", length=255) 
    */ 
    private $slug; 
    public function __construct() 
    { 
     $this->categories = new \Doctrine\Common\Collections 
\ArrayCollection(); 
    } 

ответ

2

Извините, это не имело никакого отношения к Сонате.

Это была проблема с отображением. В документации Doctrine2 указано:

Собственная сторона отношений определяет обновления отношений в базе данных

Чтобы полностью понять это, помните, что двунаправленные ассоциации: , которые хранятся в мире объектов. На каждой стороне есть две ссылки, и эти две ссылки представляют собой одну ассоциацию , но могут меняться независимо друг от друга. Конечно, в правильное применение семантика двунаправленной ассоциации должным образом поддерживается разработчиком приложения (это его ответственность ). Доктрина должна знать, какая из этих двух ссылок в памяти - это та, которая должна сохраняться, а какая нет. Это значение , для которого в основном используется понятие собственная/обратная концепция.

Изменения, внесенные только в обратную сторону ассоциации, игнорируются. забудьте обновить обе стороны двунаправленной ассоциации (или по наималейшей стороны имущей, с точкой Доктрины зрения)

владеющей стороны двунаправленной ассоциации стороны доктрина «смотрит на» при определении состояния от ассоциации и , следовательно, есть ли что-нибудь, что нужно сделать для обновления ассоциации в базе данных.

Мое отображение было определено следующим образом: -

class Tag 
{ 
... 
    /** 
    * @ORM\ManyToMany(targetEntity="Category", mappedBy="tags") 
    */ 
    protected $categories; 
... 
} 

class Category 
{ 
... 
    /** 
    * @ORM\ManyToMany(targetEntity="Tag", inversedBy="categories") 
    */ 
    protected $tags; 
... 
} 

Установка "inversedBy" в тег класс, решить эту проблему. Таким образом, правильная реализация такова:

class Tag 
{ 
... 
    /** 
    * @ORM\ManyToMany(targetEntity="Category", inversedBy="tags") 
    */ 
    protected $categories; 
... 
} 

class Category 
{ 
... 
    /** 
    * @ORM\ManyToMany(targetEntity="Tag", mappedBy="categories") 
    */ 
    protected $tags; 
... 
}