在Doctrine中使用现有数据库条目作为外键

时间:2016-03-14 16:58:04

标签: php doctrine-orm

鉴于已经存在的类别对象。如果只知道了cateories的id,那么如何在新对象中重用一对多关系中的现有类别

/** @Entity() */
class Category {
    /**
     * @var string
     * @\Doctrine\ORM\Mapping\Column(type="string")
     */
    private $name;
    /** @var  string
     * @\Doctrine\ORM\Mapping\Id()
     * @\Doctrine\ORM\Mapping\Column(type="string")
     */
    private $id;

    /**
     * Category constructor.
     * @param string $name
     * @param string $id
     */
    public function __construct($name, $id)
    {
        $this->name = $name;
        $this->id   = $id;
    }

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @return string
     */
    public function getId()
    {
        return $this->id;
    }
}

现在我可以说两个类别id = 1 - >小说和id = 2 - >英语书。 现在我知道了类别的ID,并希望在Book对象中保存一对多关系。

/** @Entity() */
class Book {
    /** @var  mixed
    * @\Doctrine\ORM\Mapping\OneToMany()
     */
    private $categories;
    /** @var  string */
    private $title;

    /**
     * Book constructor.
     * @param mixed $categories
     * @param string $title
     */
    public function __construct($categories, $title)
    {
        $this->categories = $categories;
        $this->title      = $title;
    }

    /**
     * @return mixed
     */
    public function getCategories()
    {
        return $this->categories;
    }

    /**
     * @return string
     */
    public function getTitle()
    {
        return $this->title;
    }
}

是否可以手动创建和持久化书籍对象,并引用现有且已经持久化的对象,我只知道该ID?

1 个答案:

答案 0 :(得分:2)

如果不至少检索Reference代理,则无法实现此目的:

$categoriesRefs = ['english' => 1, 'fiction' => 2];
$categories = [];

foreach($categoriesRefs as $ref){
   $categories[] = $em->getReference('Namespace\Entity\Category', $ref));
}

$book = new Book($categories, 'title');

$em->persist($book);
$em->flush();

您可以在不提取整个类别对象的情况下存储类别 详细了解reference proxy