【问题标题】:How to properly set referring entity property when creating sub entity in Sonata Admin Bundle using sonata_type_model field使用 sonata_type_model 字段在 Sonata Admin Bundle 中创建子实体时如何正确设置引用实体属性
【发布时间】:2015-08-04 23:42:48
【问题描述】:

我觉得我在这里遗漏了一些简单的东西......TLDR:使用sonata_type_model字段,在向父级添加新子实体时使用模态,如何将父级传递给子实体以将其添加到子实体实体的参考字段?

#

我有两个实体,“用户”和“角色”实体。

用户 -> OneToMany -> 角色。

我试图弄清楚如何从用户的 Sonata Admin Bundle 页面创建、编辑和删除角色。

在我的 UserAdmin 类中,我已经像这样配置了表单字段:

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

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

【问题讨论】:

    标签: symfony doctrine-orm sonata-admin symfony-sonata sonata


    【解决方案1】:

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

    使用类似的东西来替换你实际的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 app/console doctrine:generate:entities

    如果它很好,你必须编辑你的 addRole() 和 removeRole() 方法。

    她一定是这样的:

    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() 函数来手动设置角色实体上的用户实体,如下面的回复中所述
    【解决方案2】:

    我不认为这是解决此问题的预期方法,但需要在编辑用户实体时在模式窗口中打开的“角色”实体表单上设置“用户”实体是通过使用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]);
            }
        });
    });
    

    一个令人讨厌的解决方案,但有时我们只需要一些工作......

    【讨论】:

      猜你喜欢
      • 2018-01-25
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 2012-07-05
      • 1970-01-01
      • 2012-09-03
      相关资源
      最近更新 更多