Doctrine OneToOne让我发疯

时间:2015-08-21 16:02:20

标签: symfony doctrine-orm one-to-one

我知道这是一个反复出现的问题,但在2个实体之间创建OneToOne关系并运行“php app / console doctrine:schema:validate'我收到这个错误:

'[Mapping]  FAIL - The entity-class 'HO\CisBundle\Entity\AffiliateSalesAccounts' mapping is invalid:
* The association HO\CisBundle\Entity\AffiliateSalesAccounts#affiliate refers to the inverse side field HO\HasoffersBundle\Entity\Affiliate#affiliateSalesAccounts which does not exist.'

这是两个实体的代码的一部分:

AffiliatesSalesAccount Entity

namespace HO\CisBundle\Entity;

use HO\HasoffersBundle\Entity\Affiliate;
use Doctrine\ORM\Mapping as ORM;

/**
 *
 * @ORM\Table(name="AffiliateSalesAccounts")
 * @ORM\Entity()
 * @ORM\HasLifecycleCallbacks
 */
class AffiliateSalesAccounts {

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

    /**
     * @var \HO\HasoffersBundle\Entity\Affiliate
     *
     * @ORM\OneToOne(targetEntity="HO\HasoffersBundle\Entity\Affiliate", inversedBy="affiliateSalesAccounts")
     * @ORM\JoinColumn(name="affiliate_id", referencedColumnName="id")
     *
     */
    private $affiliate;

    ...

    /**
     * @param Affiliate $affiliate
     */
    public function setAffiliate(Affiliate $affiliate)
    {
        $this->affiliate = $affiliate;
    }

    /**
     * @return Affiliate
     */
    public function getAffiliate()
    {
        return $this->affiliate;
    }
}

加盟实体

namespace HO\HasoffersBundle\Entity;

use HO\CisBundle\Entity\AffiliateSalesAccounts;
use Doctrine\ORM\Mapping as ORM;

/**
 *
 * @ORM\Table(name="ho_Affiliate")
 */
class Affiliate
{


    /**
     * @var AffiliateSalesAccounts
     *
     * @ORM\OneToOne(targetEntity="HO\CisBundle\Entity\AffiliateSalesAccounts", mappedBy="affiliate")
     */
    private $affiliateSalesAccounts;


    ....

    /**
     * @param \HO\CisBundle\Entity\AffiliateSalesAccounts $affiliateSalesAccounts
     */
    public function setAffiliateSalesAccounts($affiliateSalesAccounts)
    {
        $this->affiliateSalesAccounts = $affiliateSalesAccounts;
    }

    /**
     * @return \HO\CisBundle\Entity\AffiliateSalesAccounts
     */
    public function getAffiliateSalesAccounts()
    {
        return $this->affiliateSalesAccounts;
    }

}

我在2个实体之间有其他类似的OneToOne关系,效果很好。

有人可以帮助我吗?

非常感谢..

3 个答案:

答案 0 :(得分:0)

我不确定你的问题,但我注意到我是以不同的方式做的,我只是让代码在这里,以便你能够检查它

/**
 * @ORM\OneToOne(targetEntity="Profile", mappedBy="user", cascade={"remove"})
 **/
private $profile;

另一堂课:

/**
 * @var \Lifecrops\LCUserBundle\Entity\User
 *
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="NONE")
 * @ORM\OneToOne(targetEntity="Lifecrops\LCUserBundle\Entity\User", inversedBy="profile")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="User_id", referencedColumnName="id")
 * })
 */
private $user;

答案 1 :(得分:0)

通常我会做这样的事情:

namespace HO\CisBundle\Entity;

use HO\HasoffersBundle\Entity\Affiliate;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="AffiliateSalesAccounts")
 * @ORM\Entity()
 */
class AffiliateSalesAccounts {

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

    /**
     * @ORM\OneToOne(targetEntity="Affiliate", inversedBy="affiliateSalesAccounts")
     * @ORM\JoinColumn(name="affiliate_id", referencedColumnName="id")
     *
     */
    private $affiliate;

    /**
     * @param Affiliate $affiliate
     */
    public function setAffiliate(Affiliate $affiliate)
    {
        $this->affiliate = $affiliate;
    }

    /**
     * @return Affiliate
     */
    public function getAffiliate()
    {
        return $this->affiliate;
    }
}

第二个实体:

namespace HO\HasoffersBundle\Entity;

use HO\CisBundle\Entity\AffiliateSalesAccounts;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="ho_Affiliate")
 * @ORM\Entity()
 */
class Affiliate
{


    /**
     * @ORM\OneToOne(targetEntity="AffiliateSalesAccounts", mappedBy="affiliate")
     */
    private $affiliateSalesAccounts;

    /**
     * @param AffiliateSalesAccounts $affiliateSalesAccounts
     */
    public function setAffiliateSalesAccounts($affiliateSalesAccounts)
    {
        $this->affiliateSalesAccounts = $affiliateSalesAccounts;
    }

    /**
     * @return AffiliateSalesAccounts
     */
    public function getAffiliateSalesAccounts()
    {
        return $this->affiliateSalesAccounts;
    }

}

清除缓存是非常重要的一部分,如果一切都变坏,你可以查看:

doctrine:
  orm:
    auto_mapping: true

答案 2 :(得分:0)

好的,我解决了这个问题......首先,很抱歉打扰你,因为这是一个愚蠢的愚蠢心不在焉...因为我们使用Redis来缓存学说(使用sncRedisBundle),特别是元数据和查询,Affiliate entity is缓存在Redis中,但没有新的字段声明“affiliateSalesAccounts”。删除存储关联实体的密钥后问题解决了。

非常感谢你的评论