sonata_type_model/symfony не сохраняет отношения один ко многим

У меня есть отношение один ко многим между учетными записями и пользователями. Я использую администратор сонаты для CRUD. Насколько я знаю, он использует формы Symfony для выполнения своей работы. Я попытался добавить такое поле:

        ->add('users', 'entity', array(
            'class'    => 'AcmeDemoBundle:User',
            'required' => true,
            'multiple' => true,
            'expanded' => true
        ));

Я также пробовал с sonata_type_model

        ->add('users', 'sonata_type_model', array(
            'class'    => 'AcmeDemoBundle:User',
            'required' => true,
            'multiple' => true,
            'expanded' => true
        ));

Проблема в том, что ничего (связанное с отношениями) не сохраняется при редактировании учетной записи (когда я редактирую пользователя, все обновляется). Я знаю, что мне нужно обновить сторону владельца (сторону пользователя), но мне это не удалось, потому что "публичная функция addUser($user)" не вызывается, поэтому я не могу добавить что-то вроде "$user->setAccount($this )" к этой функции.

Мои сущности выглядят так:

class Account
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @ORM\Column(type="string")
 */
protected $name;

/**
 * @ORM\OneToMany(targetEntity="Acme\DemoBundle\User", mappedBy="account", cascade={"persist", "remove"})
 */
protected $users;

/**
 * Add users
 *
 * @param Acme\DemoBundle\Entity\User $user
 * @return Account
 */
public function addUser(\Acme\DemoBundle\Entity\User $user)
{
    $user->setAccount($this);
    $this->users[] = $user;

    return $this;
}

/**
 * Remove users
 *
 * @param Acme\DemoBundle\Entity\User $user
 */
public function removeUser(\Acme\DemoBundle\Entity\User $user)
{
    $user->setAccount(null);
    $this->users->removeElement($user);
}

/**
 * Get users
 *
 * @return Doctrine\Common\Collections\Collection 
 */
public function getUsers()
{
    return $this->users;
}
}

.

class User extends BaseUser
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @ORM\ManyToOne(targetEntity="Acme\DemoBundle\Account", inversedBy="users")
 */
protected $account;

/**
 * Set account
 *
 * @param Acme\DemoBundle\Entity\Account $account
 * @return User
 */
public function setAccount(\Acme\DemoBundle\Entity\Account $account = null)
{
    $this->account = $account;

    return $this;
}

/**
 * Get account
 *
 * @return Acme\DemoBundle\Entity\Account 
 */
public function getAccount()
{
    return $this->account;
}
}

person Robert Dolca    schedule 15.12.2012    source источник


Ответы (1)


Моя проблема была связана с этим https://github.com/symfony/symfony/issues/1540.

После того, как я добавил by_reference => false, вызываются установщики учетной записи, и сторона-владелец может быть обновлена.

person Robert Dolca    schedule 17.12.2012
comment
Вы, сэр, ангел милосердия, посланный на мое смертное ложе! Уже более 20 часов я мучаюсь, ищу и плачу над тем, как решить эту, казалось бы, простую задачу! И до этого самого момента я пропустил, что это вызывает мою функцию добавления! Большое вам спасибо за то, что вы преуспели там, где другие так болезненно потерпели неудачу. Кстати, документация по Сонате — это детище темного властелина ада! Так что еще раз спасибо - person Zjoia; 19.03.2013
comment
Zjoia прекрасно описывает, что я сейчас чувствую, спасибо, чувак - person Taking1n1; 27.02.2019