Question: **posts** and **tags** have a **many-to-many** relationship(pretty much like stackoverflow),so the code to do it without an ORM should be:

```
$dml = "insert into posts(title,body,created) value($title,'{$_POST['post-text']}',now())";
mysql_query($dml,$con);
$pid = mysql_insert_id($con);
//deal with tags

if(isset($_POST['tagnames']))
{
 $tags = preg_split('/\s+/',trim($_POST['tagnames']));
 $list = "('".implode("',1),('", $tags)."',1)";
 $dml = "insert into tags(name,count) values $list on duplicate key update count=count+1";
 mysql_query($dml,$con);
 $list = "('" . implode("','", $tags) . "')";
 $dml = "insert into post_tags(pid,tagId) select $pid,id from tags where name in $list";
 mysql_query($dml,$con);
}

```

How to do it with by doctrine?

Suppose that the related classes are already generated from schemas

The difficulty lies in the `on duplicate key update` part.

To step further,it can be more difficult to handle when someone is editing the `posts`...

Answer: 
Instead of managing this relationship yourself you might want to consider using [sfDoctrineActAsTaggablePlugin](http://www.symfony-project.org/plugins/sfDoctrineActAsTaggablePlugin), which will probably make your life easier.
Well, for me it looks pretty easy.

```
$post = new Post();
$tags = Doctrine_Query::create()->from('Tags t')->whereIn('t.name', $_POST['tags'])->execute();
foreach ($tags as $tag) $post->link($tag->get('id'));
$post->save();

```

Why not [read manual](http://www.doctrine-project.org/documentation/manual/1_2/en/working-with-models:many-to-many-relations) first? Also please consider to generate a module with `symfony doctrine:generate-module post Post` and carefully read generated code.