【问题标题】:OneToOne relationship in Doctrine2 ORM and SymfonyDoctrine2 ORM 和 Symfony 中的 OneToOne 关系
【发布时间】:2013-09-30 11:14:18
【问题描述】:

我有两个实体,分别是 PictureTag 和 Tag,关系如下:

/**
 * @ORM\Entity
 * @ORM\Table(name="picture_tag")
 * @ORM\HasLifecycleCallbacks()
 */
class PictureTag
{
     /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     *
     * @ORM\OneToOne(targetEntity="App\MainBundle\Entity\Tag", inversedBy="id")
     * @ORM\JoinColumn(name="tag_id", referencedColumnName="id", nullable=false)
     */
    private $tag;
}

/**
 * @ORM\Entity
 * @ORM\Table(name="tag")
 * @ORM\HasLifecycleCallbacks()
 */
class Tag
{
     /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\ManyToOne(targetEntity="App\MainBundle\Entity\PictureTag", inversedBy="tag")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     * @ORM\Column(name="tag", type="string", nullable=true)
     */
    private $tag;

}

基本上我希望标签表包含所有唯一标签,因此标签中没有重复。我希望 picturetag 有一个指向标签 id 的连接列。所以这是我在控制器中的代码:

foreach ($image->tags as $tag) {
    $existingTag = $em->getRepository('AppMainBundle:InstagramTag')->findOneByTag($tag);
    $instaPictureTag = new PictureTag();
    if ($existingTag) {
        $instaPictureTag->setTag($existingTag);
    } else {
         $instagramTag = new Tag();
         $instagramTag->setTag($tag);
         $em->persist($instagramTag);
         $instaPictureTag->setTag($instagramTag);
    }

    $instaPictureTag->setPicture($instaShopPicture);
    $em->persist($instaPictureTag);

}

所以关系基本上是:

One picture is going to have many tags. And one tag will belong to many pictures. 

这里的图片标签是中间表。

基本上我正在检查标签表中是否已经存在标签,如果是,那么我将图片标签设置为与该标签相关联,如果没有,则创建一个。但是这样做会产生以下错误:

Fatal error: Call to a member function setValue() on a non-object in /Users/MyName/Sites/App/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php on line 2625

知道这是为什么吗?

【问题讨论】:

    标签: php symfony orm doctrine-orm


    【解决方案1】:

    据我了解,您希望在 PictureTag 和 Tag 之间实现 OneToMany 双向关系。

    请尝试:

    /**
     * @ORM\Entity
     * @ORM\Table(name="picture_tag")
     * @ORM\HasLifecycleCallbacks()
     */
    class PictureTag
    {
        /**
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
    
        /**
         * @ORM\ManyToOne(targetEntity="DynamicSolutions\Bundle\ProsAndConsBundle\Entity\Tag", inversedBy="pictureTags")
         * @ORM\JoinColumn(name="tag_id", referencedColumnName="id", nullable=false)
         */
        private $tag;
    }
    
    /**
     * @ORM\Entity
     * @ORM\Table(name="tag")
     * @ORM\HasLifecycleCallbacks()
     */
    class Tag
    {
        /**
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
    
        /**
         * @ORM\OneToMany(targetEntity="PictureTag", mappedBy="tag")
         */
        private $pictureTags;
    
        /**
         * @var string
         * @ORM\Column(name="tag", type="string", nullable=true)
         */
        private $tag;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多