«многие ко многим» и пакет «соната-администратор»

У меня есть связанные объекты ManyToMany Partner и District, но когда я редактирую отношения между объектами изменений объектов, они не сохраняются.

Район объекта

class District
{
    ...
    /**
     * @ORM\ManyToMany(targetEntity="Partner", inversedBy="districts")
     * @ORM\JoinTable(name="thedo_pcsuppurt_districts_partners",
     *     joinColumns={
     *     @ORM\JoinColumn(name="district_id", referencedColumnName="id")
     *   },
     *   inverseJoinColumns={
     *     @ORM\JoinColumn(name="partner_id", referencedColumnName="id")
     *   }
     * ) 
     */
    private $partners;
    ...

Юридический партнер

class Partner
{
    ...
    /**
     * @ORM\ManyToMany(targetEntity="District", mappedBy="partners")
     * @ORM\OrderBy({"name" = "ASC"})
     */
    private $districts;
    ...

Класс администратора

class PartnerAdmin extends Admin
{
    public function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->with('General')
                ->add('name', null, array('label' => 'name'))
                ->add('mail', null, array('label' => 'mail'))
                ->add('ticket_prefix', null, array('label' => 'Ticket Prefix'))
            ->end()
            ->with('Districts', array('collapsed' => true))
                ->add('districts', null, array('label' => 'Districts', 'expanded' => true, 'by_reference' => false, 'multiple' => true))
            ->end()
        ;
    }
    ...

У меня нет никаких ошибок, но при перезагрузке страницы отношения не сохраняются.

UPD В своих логах я вижу это

[2013-10-03 10:09:19] doctrine.DEBUG: SELECT t0.id AS id1, t0.name AS name2, t0.mail AS mail3, t0.login AS login4, t0.password AS password5, t0.ticket_prefix AS ticket_prefix6, t0.created_at AS created_at7, t0.updated_at AS updated_at8 FROM thedo_pcsupport_partner t0 WHERE t0.id = ? ["1"] []
[2013-10-03 10:09:19] doctrine.DEBUG: SELECT t0.id AS id1, t0.name AS name2, t0.city_id AS city_id3 FROM thedo_pcsupport_district t0 [] []
[2013-10-03 10:09:19] doctrine.DEBUG: SELECT t0.id AS id1, t0.name AS name2, t0.city_id AS city_id3 FROM thedo_pcsupport_district t0 INNER JOIN thedo_pcsuppurt_districts_partners ON t0.id = thedo_pcsuppurt_districts_partners.district_id WHERE thedo_pcsuppurt_districts_partners.partner_id = ? ORDER BY t0.name ASC [1] []

person Nikita Borisovich Djigurda    schedule 02.10.2013    source источник


Ответы (2)


Можете ли вы попробовать cascade={"persist"} на @ORM\ManyToMany аннотациях?

Кроме того, убедитесь, что у вас есть такие сумматоры:

// District.php

public function addPartner($partner)
{
    $this->partners[] = $partner;
    $partner->setDistrict($this); // This line is important for Sonata.
}

Я надеюсь, вы знаете, что такие сумматоры (и удаления) могут быть легко сгенерированы с помощью doctrine:generate:entities (не doctrine:generate:entity).

person TautrimasPajarskas    schedule 06.10.2013
comment
Это должно быть $partner-›addDistrict($this) в вашем примере @Tautrimas Pajarskas, так как это пример ManyToMany. То же самое для метода удаления. Тогда не забудьте параметр orphanRemoval=true. - person webDEVILopers; 14.04.2015

попробуй это :

->add('AttName', 'sonata_type_model', array('multiple' => true, 'by_reference' => false)) 
person Mohamed Ayoub BENJELLOUN    schedule 28.06.2014
comment
на самом деле это комбинация обоих ответов. см. symfony.com/doc /current/cookbook/form/ и прокрутите вниз до примечаний к доктрине: каскадные отношения и сохранение обратной стороны - person Heyflynn; 10.10.2014
comment
Это должен быть правильный ответ; хотя, честно говоря, я сделал и то, и другое. :) - person kyeno; 12.03.2019