Мне интересно, как работает тегирование. Моя идея пока:
У меня есть три таблицы базы данных Bookmarks
id|title|uri|…
, Tags
id|title|…
и bookmarks_tags (mxm, 3NF). Моим первым тестом будет только однопользовательская система, поэтому мне не придется иметь дело с тегами, принадлежащими конкретным пользователям.
Хранение закладки: uri
(String) + tags
(Строка, например, Lorem Ipsum, Hello
должна приводить к двум тегам: Lorem Ipsum
и Hello
).
Проблема: где и как мне создать недостающий Tags
и загрузить известные?
Возможно создание тегов в модели (см. Bookmark :: setTags () ниже). Загрузка и компоновка в модели, по-видимому, невозможны, поскольку ORM недоступен внутри класса (или есть статический ресурс для извлечения ORM? Это будет рекомендовано?).
Я мог бы загрузить существующие теги и создать теги внутри Controller
, но я предполагаю, что тегирование должно быть работой модели.
Я использую Symfony2 с Doctrine2.
Класс закладок / Таблица
* @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 */