views:

36

answers:

1

I'm doing a blog engine using symfony as a learning exercice.

How do I get the list of tags from the id of a blog post ? Here's the database shema : alt text

I added the following in the model :

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');

}

and here is part of the 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  A: 

It's difficult to tell without seeing exactly how your schema is defined (i.e. schema.yml), but my guess would be that this would work, assuming you have the content object loaded:

$tags = $content->Tags;

Otherwise, your code snippet should work, so far as I can tell. You just need to stick ->exec() on the end to make it return the results of the query rather than the query object itself:

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();

Edit Having seen your schema, it seems that you have not created a relationship between Content and Tags, which you need to do. You can let Doctrine handle their interaction. The Symfony and Doctrine book uses something essentially identical to your example to demonstrate how to do a many-to-many relationship. (Note that, although this document is for an out-of-date version of symfony, the syntax for this feature has not changed.)

lonesomeday
I didn't know about "refClass", thanks !
Manu