我对标记的工作原理感兴趣。我的想法到目前为止:
我有三个数据库表Bookmarks
id|title|uri|…
,Tags
id|title|…
和bookmarks_tags(mxm,3NF)。我的第一个测试只是单用户系统,所以我不需要处理特定用户拥有的标签。
存储书签:uri
(字符串)+ tags
(字符串,例如。Lorem Ipsum, Hello
应生成两个标记:Lorem Ipsum
和Hello
)。
问题:我应该在哪里以及如何创建缺失的Tags
并加载已知的?{/ p>
可以在模型中创建标签(请参阅下面的Bookmark :: setTags())。在模型中加载和链接似乎是不可能的,因为ORM在类中是不可用的(或者是否有用于获取ORM的静态ressource?这会被推荐吗?)。
我可以加载现有标签并在Controller
内创建标签,但我认为标记应该是模型的工作。
我正在使用Sytrfony2和Doctrine2。
Bookmark Class / Table
* @ORM\Table()
* @ORM\Entity(repositoryClass="X\BookmarksBundle\Entity\BookmarkRepository")
*/
class Bookmark
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string $title
*
* @ORM\Column(name="title", type="string", length=255)
*/
private $title;
/**
* @var string $uri
*
* @ORM\Column(name="uri", type="string", length=255)
*/
private $uri;
/**
* @var datetime $created_at
*
* @ORM\Column(name="created_at", type="datetime")
*/
private $created_at;
/**
* @var datetime $deleted_at
*
* @ORM\Column(name="deleted_at", type="datetime")
*/
private $deleted_at;
/** @ORM\ManyToMany(targetEntity="Tag", cascade={"persist", "remove"}) */
private $tags;
public function __construct()
{
$this->tags = new ArrayCollection();
}
public function getTags () {
if ($this->tags->isEmpty()) {
return "NO TAGS";
}
// TODO load tags from db
return "TODO: TAGS FOUND";
}
public function setTags ($tags) {
// TODO create and load/link existing tags
$tag = new Tag();
$tag->setTitle("test tag");
$this->tags->add($tag);
}
/* setters and getters for other private variables here */
标记类/表
* @ORM\Table()
* @ORM\Entity(repositoryClass="X\BookmarksBundle\Entity\TagRepository")
*/
class Tag
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string $title
*
* @ORM\Column(name="title", type="string", length=64)
*/
private $title;
/**
* @var datetime $created_at
*
* @ORM\Column(name="created_at", type="datetime")
*/
private $created_at;
/**
* @var datetime $deleted_at
*
* @ORM\Column(name="deleted_at", type="datetime", nullable=true)
*/
private $deleted_at;
public function __construct () {
$this->created_at = new \DateTime('now');
}
/* setters and getters for other private variables here */
答案 0 :(得分:1)
从数据库中获取实体时,Doctrine2不会为您提供POPO实体,而是提供“代理”。此代理能够从数据库中加载缺少的元素。因此,您不必实现从数据库中检索丢失数据的逻辑。
顺便说一句,你也可以创建这个方法:
public function addTag(Tag $tag)
{
$this->tags->add($tag);
}