Symfony 使用Sonata_type_model字段在Sonata管理包中创建子实体时如何正确设置引用实体属性

Symfony 使用Sonata_type_model字段在Sonata管理包中创建子实体时如何正确设置引用实体属性,symfony,doctrine-orm,sonata-admin,symfony-sonata,sonata,Symfony,Doctrine Orm,Sonata Admin,Symfony Sonata,Sonata,我觉得这里缺少了一些简单的东西……TLDR:使用sonata_type_model字段,在向父实体添加新子实体时使用model,如何将父实体传递给子实体以将其添加到子实体的引用字段 # 我有两个实体在起作用,“用户”和“角色”实体 用户->一个域名->角色 我试图找出如何从用户的Sonata管理包页面创建、编辑和删除角色 在我的UserAdmin类中,我将表单字段配置为: $formmapper->add('roles', 'sonata_type_model', array(

我觉得这里缺少了一些简单的东西……TLDR:使用sonata_type_model字段,在向父实体添加新子实体时使用model,如何将父实体传递给子实体以将其添加到子实体的引用字段

# 我有两个实体在起作用,“用户”和“角色”实体

用户->一个域名->角色

我试图找出如何从用户的Sonata管理包页面创建、编辑和删除角色

在我的UserAdmin类中,我将表单字段配置为:

$formmapper->add('roles', 'sonata_type_model', array(
                'required' => false,
                'btn_delete' => true,
                'btn_list' => true,
                'multiple' => true,
                'btn_add' => true,
            ))

现有角色表现良好。如果我单击角色字段下的“添加”按钮,模式窗口将显示“角色”管理表单中的字段。我的问题是,当我保存新角色时,它没有正确引用创建它的用户。我不知道如何将父用户实体传递给子角色实体!这应该很简单,但是很简单。我在任何地方都找不到这个答案

如果您希望一个用户可以有多个角色(“类中的multiple=>true”选项),并且角色可以由多个用户使用,那么您应该更喜欢
manytoman
关系

使用类似的方法替换实际的
OneToMany

//Entity\User   

/**
* @ORM\ManyToMany(targetEntity="Role", mappedBy="users", cascade={"persist"})
*/
protected $roles;
在您的子实体中:

//Entity\Role

/**
* @ORM\ManyToMany(targetEntity="User", inversedBy="roles", cascade={"persist", "remove"})
* @ORM\JoinTable(name="users_roles",
*     joinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")},
*     inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}
* )     *
* @var ArrayCollection $users
*/
protected $users;
父实体(用户)应具有addRole()、removeRole()和getRole()方法。 否则,您应该执行
php应用程序/控制台原则:generate:entities

如果效果不错,则必须编辑addRole()和RemoveOLE()方法

她一定是这样的:

public function addRole(\Namespace\Bundle\Entity\Role $roles)
{
     $this->roles[] = $roles;
     $roles->addUser($this);

     return $this;
}

public function removeRole(\Namespace\Bundle\Entity\Role $roles)
{
    $this->roles->removeElement($roles);
    $roles->removeUser($this);
}

然后,您的addRole应该在Sonata中工作

我不认为这是解决此问题的预期方法,但需要在编辑用户实体时在模式窗口中打开的“角色”实体窗体上设置“用户”实体,这是通过使用jQuery ajaxComplete()函数监听ajax窗口打开来实现的,检查它是否正确,从页面URL获取用户ID,并在隐藏的表单元素中设置该ID

jQuery(document).ready(function() {
    $(document).ajaxComplete(function (event, request, settings) {
        if (settings.url.indexOf('/your-entity-admin-path-') >= 0){
            var pathArray = window.location.pathname.split( '/' );
            $('.modal-body .box-body input[type=hidden]').val(pathArray[3]);
        }
    });
});

这是一个令人讨厌的解决方案,但有时我们只是需要一些事情来解决…

谢谢您的回复!我的结构不是标准的,用户和角色之间没有多对多关系,而是每个角色实体都特定于一个用户实体。我能够实现这一点的唯一方法是插入jQuery的ajaxComplete()函数,在角色实体上手动设置用户实体,如下面的响应中所述