Symfony:Sonata用户和我的捆绑实体之间的ManyToMany关系

时间:2014-08-24 18:59:37

标签: symfony doctrine-orm entity-relationship sonata-admin sonata-user-bundle

我试图在Sonata的用户和名为" Network"的实体之间创建一个ManyToMany关系。它位于我的包中。

我们的想法是能够通过SonataAdmin的用户创建/版本为每个用户分配多个网络。

以下是我所拥有的:

用户实体:

<?php
namespace Application\Sonata\UserBundle\Entity;

use Sonata\UserBundle\Entity\BaseUser as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

class User extends BaseUser
{
    /**
     * @var integer $id
     */
    protected $id;

    /**
     * @ORM\ManyToMany(targetEntity="\Acme\TestBundle\Entity\Network", mappedBy="users", cascade={"persist", "remove"})
     */
    protected $networks;

    public function __construct()
    {
        parent::__construct();
        $this->networks = new ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer $id
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Add network
     *
     * @param \Acme\TestBundle\Entity\Network $network
     * @return User
     */
    public function addNetwork($network)
    {
        $this->networks[] = $network;

        $network->addUser($this);

        return $this;
    }

    /**
     * Remove network
     *
     * @param \Acme\TestBundle\Entity\Network $network
     */
    public function removeNetwork($network)
    {
        $this->networks->removeElement($network);

        $network->removeUser($this);
    }

    /**
     * Get networks
     *
     * @return \Doctrine\Common\Collections\ArrayCollection
     */
    public function getNetworks()
    {
        return $this->networks;
    }
}

网络实体:

<?php
namespace Acme\TestBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

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

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

    /**
     * @ORM\ManyToMany(targetEntity="\Application\Sonata\UserBundle\Entity\User", inversedBy="networks")
     * @ORM\JoinTable(name="Networks_Users")
     */
    protected $users;

    public function __construct()
    {
        $this->users = new ArrayCollection();
    }

    public function __toString()
    {
        return $this->getName();
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Network
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Add user
     *
     * @param \Application\Sonata\UserBundle\Entity\User $user
     * @return Network
     */
    public function addUser($user)
    {
        $this->users[] = $user;

        return $this;
    }

    /**
     * Remove user
     *
     * @param \Application\Sonata\UserBundle\Entity\User $user
     */
    public function removeUser($user)
    {
        $this->users->removeElement($user);
    }

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

应用\ config.yml

sonata_user:
    admin:
        user:
            class: Acme\TestBundle\Admin\UserAdmin
    #...#

用户管理类:

<?php
namespace Acme\TestBundle\Admin;

use Sonata\UserBundle\Admin\Model\UserAdmin as SonataUserAdmin;

class UserAdmin extends SonataUserAdmin
{
    /**
     * {@inheritdoc}
     */
    protected function configureFormFields(\Sonata\AdminBundle\Form\FormMapper $formMapper)
    {
        parent::configureFormFields($formMapper);

        $formMapper
            ->with('Networks')
            ->add('networks', 'sonata_type_model', array(
                'by_reference' => false,
                'required' => false,
                'expanded' => false,
                'multiple' => true,
                'label' => 'Choose the user Networks',
                'class' => 'AcmeTestBundle:Network'
            ))
            ->end();
    }
}

问题在于:

当我通过SonataAdmin编辑现有用户并为其分配某些网络时,更改将持久保存到数据库,但选择器显示为空,就好像没有分配任何网络一样。如果我再次尝试分配网络,我会收到数据库约束违规消息(正如预期的那样)。

我发现由于某种原因,$ networks ArrayCollection返回NULL,好像无法从用户端建立关系:

$usr = $this->getUser();
$selected_networks = $usr->getNetworks(); // returns NULL

如果我尝试从网络端管理用户,一切正常(没有添加或更改实际代码):

<?php
namespace Acme\TestBundle\Admin;

use Sonata\AdminBundle\Form\FormMapper;

class NetworkAdmin extends Admin
{
    /**
     * @param \Sonata\AdminBundle\Form\FormMapper $formMapper
     *
     * @return void
     */
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->with('General')
            ->add('name')
            ->end()
            ->with('Users')
            ->add('users', 'sonata_type_model', array(
                'by_reference' => false,
                'required' => false,
                'expanded' => false,
                'multiple' => true,
                'label' => 'Choose the network Users',
                'class' => 'ApplicationSonataUserBundle:User'
            ))              
        ;
    }
}

我很难过。有什么想法吗?

谢谢大家。

0 个答案:

没有答案