与 FOSUserBundle 和易于扩展的自定义实体创建关系时出错

Posted

技术标签:

【中文标题】与 FOSUserBundle 和易于扩展的自定义实体创建关系时出错【英文标题】:Error creating relationship with FOSUserBundle and custom entity with easy-extends 【发布时间】:2019-01-24 13:45:06 【问题描述】:

我在奏鸣曲中跟随this documentation,一步一步地成功了。 然后我添加了一个新实体并尝试生成与用户实体的多对多关系,当我验证它时返回此错误

$ bin/console doctrine:schema:validate

Mapping
-------

 [FAIL] The entity-class AppBundle\Entity\Business mapping is invalid:
 * The association AppBundle\Entity\Business#user refers to the owning side field Application\Sonata\UserBundle\Entity\User#business which does not exist.


Database
--------


 [OK] The database schema is in sync with the mapping files.                                                            

这是我的两个实体

命名空间 AppBundle\Entity;

使用 Doctrine\ORM\Mapping 作为 ORM; 使用 Gedmo\Mapping\Annotation 作为 Gedmo;

/**
 * Business
 *
 * @ORM\Table(name="business")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\BusinessRepository")
 */
class Business

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="BusinessName", type="string", length=255)
     */
    private $businessName;

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

    /**
     * @var string
     *
     * @ORM\Column(name="cuit", type="string", length=13)
     */
    private $cuit;

    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\BankAccountType", inversedBy="business")
     */
    private $bankAccountType;

    /**
     * @var \DateTime $created
     *
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(type="datetime")
     */
    private $created;

    /**
     * @var \DateTime $updated
     *
     * @Gedmo\Timestampable(on="update")
     * @ORM\Column(type="datetime")
     */
    private $updated;

    /**
     * @ORM\ManyToMany(targetEntity="\Application\Sonata\UserBundle\Entity\User", mappedBy="business")
     */
    private $user;

    /**
     * @var bool
     *
     * @ORM\Column(name="isActive", type="boolean")
     */
    private $isActive = true;

还有这个

namespace Application\Sonata\UserBundle\Entity;


use Sonata\UserBundle\Entity\BaseUser as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * This file has been generated by the SonataEasyExtendsBundle.
 *
 * @link https://sonata-project.org/easy-extends
 *
 * References:
 * @link http://www.doctrine-project.org/projects/orm/2.0/docs/reference/working-with-objects/en
 */
class User extends BaseUser

    /**
     * @var int $id
     */
    protected $id;
    /**
     * @ORM\ManyToMany(targetEntity="\AppBundle\Entity\Business", inversedBy="user")
     * @ORM\JoinTable(name="business_user")
     */
    private $business;

    /**
     * Constructor
     */
    public function __construct()
    
        parent::__construct();
        $this->business = new \Doctrine\Common\Collections\ArrayCollection();
    
    /**
     * Get id.
     *
     * @return int $id
     */
    public function getId()
    
        return $this->id;
    


有什么想法吗?

【问题讨论】:

能否分享一下你的整个实体类 这是没有getter和setter的整个实体 但它在您的业务实体中包含构造函数 【参考方案1】:

这是我的代码,它可以工作。

class Role

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToMany(targetEntity="wizai\WMC\UserBundle\Entity\User", mappedBy="customRoles", fetch="EAGER")
     */
    private $users;

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



class User extends BaseUser

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


    /**
     * @ORM\ManyToMany(targetEntity="wizai\WMC\UserBundle\Entity\Role", inversedBy="users", fetch="EAGER")
     * @ORM\JoinTable(name="user_role",
     *      joinColumns=@ORM\JoinColumn(name="user", referencedColumnName="id"),
     *      inverseJoinColumns=@ORM\JoinColumn(name="role", referencedColumnName="id")
     * )
     */
    protected $customRoles;

    /**
     * User constructor.
     */
    public function __construct()
    
        $this->customRoles = new ArrayCollection();
    

如果仍然不可能,您可以先运行迁移或强制更新吗?

命令

    bin/console 原则:迁移:diff bin/控制台原则:迁移:迁移

如果没有,请尝试。

    bin/console 原则:schema:update --force --complete

【讨论】:

“doctrine:migrations”命名空间中没有定义命令。更新 --force 有效,但验证无效 您的数据库中是否有为 user_business 创建的中间表?

以上是关于与 FOSUserBundle 和易于扩展的自定义实体创建关系时出错的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2:如何实现自定义用户登录和注册——摆脱 FOSUSerBundle

与 Host App 的自定义键盘扩展通信在设备中不工作但在模拟器中工作

在 FOSUserBundle 中清除组和角色的使用

使用 FosUserBundle 创建管理员用户

FOSUserBundle 使用电子邮件登录 (Symfony2)

Firefox 84.0 正在更改下载文件的自定义文件扩展名