Как получить доступ к списку тегов, связанных с сообщением в блоге? - PullRequest
0 голосов
/ 05 октября 2010

Я работаю над движком блога, используя symfony в качестве учебного упражнения.

Как получить список тегов из идентификатора записи в блоге?Вот база данных shema: alt text

Я добавил в модель следующее:

public static function getTags($id)
{
  return Doctrine_Core::getTable('Tag')
    ->createQuery('t')
    ->select('t.name, t.slug')
    ->leftJoin('t.ContentTag ct')
    ->where('ct.content_id = ?', $id)
    ->orderBy('t.name ASC');

}

и вот часть schema.yml:

Content:
  connection: doctrine
  tableName: ec_content
  actAs:
    Sluggable:
      fields: [title]
      unique: true
      canUpdate: true
    Timestampable:
  columns:
    id:
      type: integer(4)
      fixed: false
      unsigned: true
      primary: true
      autoincrement: true
(...)
  relations:
    Comment:
      local: id
      foreign: content_id
      type: many
    ContentTag:
      local: id
      foreign: content_id
      type: many

ContentTag:
  connection: doctrine
  tableName: ec_content_tag
  columns:
    content_id:
      type: integer(4)
      fixed: false
      unsigned: true
      primary: true
      autoincrement: false
    tag_id:
      type: integer(4)
      fixed: false
      unsigned: true
      primary: true
      autoincrement: false
  relations:
    Content:
      local: content_id
      foreign: id
      type: one
    Tag:
      local: tag_id
      foreign: id
      type: one

1 Ответ

1 голос
/ 05 октября 2010

Трудно сказать, не зная точно, как определена ваша схема (т.е. schema.yml), но я думаю, что это сработает, если вы загрузите объект content:

$tags = $content->Tags;

В противном случае ваш фрагмент кода должен работать, насколько я могу судить. Вам просто нужно вставить ->exec() в конце, чтобы он возвращал результаты запроса, а не сам объект запроса:

return Doctrine_Core::getTable('Tag')
  ->createQuery('t')
  ->select('t.name, t.slug')
  ->leftJoin('t.ContentTag ct')
  ->where('ct.content_id = ?', $id)
  ->orderBy('t.name ASC')
  ->exec();

Редактировать После просмотра вашей схемы кажется, что вы не создали отношения между контентом и тегами, что вам необходимо сделать. Вы можете позволить Доктрине управлять их взаимодействием. Книга Symfony and Doctrine использует нечто, по существу идентичное вашему примеру, чтобы продемонстрировать , как установить отношение «многие ко многим» . (Обратите внимание, что, хотя этот документ относится к устаревшей версии Symfony, синтаксис этой функции не изменился.)

...