Php 论形而上学与符号学中的一元关系

Php 论形而上学与符号学中的一元关系,php,symfony,orm,doctrine-orm,Php,Symfony,Orm,Doctrine Orm,我有两个实体,叫做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

我有两个实体,叫做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有一个joincolumn,指向标记的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. 
这里的图片标签是中间表

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

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

你知道为什么吗?

据我所知,你想在PictureTag和Tag之间实现一个任意的双向关系

请尝试:

/**
 * @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;
}

据我所知,您希望在PictureTag和Tag之间实现一对一的双向关系

请尝试:

/**
 * @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;
}