Php 如何按条令(symfony)处理m2m关系(帖子和标签)?

Php 如何按条令(symfony)处理m2m关系(帖子和标签)?,php,symfony1,doctrine,Php,Symfony1,Doctrine,帖子和标签有一种多对多关系(很像stackoverflow),因此不使用ORM的代码应该是: $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

帖子标签有一种多对多关系(很像stackoverflow),因此不使用ORM的代码应该是:

$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);
}
如何按照教义来做呢

假设相关类已经从模式生成

难点在于重复密钥更新的
部分


更进一步,当有人在编辑<代码>帖子…

时,可能会更难处理,而不是自己管理这个关系,你可能想考虑使用,这可能会让你的生活更容易。

嗯,对我来说它看起来很容易。

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

为什么不先呢?还请考虑生成一个模块: SimfOnistic:生成模块POST POST <代码>并仔细阅读生成的代码。p> 谢谢!但是你能简单描述一下处理这些事情的原则吗?因为我必须处理其他几个类似的问题…我花了一些时间阅读代码,它使用
$post->addTag('toto')
来处理
标记
,它没有利用sfForm的优点,sfForm使用
绑定
API来自动化很多东西,因此我们只需要修改相关的
模型
类,行为不是用户提交数据的合适工具。它更适用于自动生成的东西,如Timestable、VersionTable。似乎您不理解我描述的用例?在您的代码中没有将新的
标记插入数据库的逻辑,其中,
标记
表在
名称
列上有一个唯一的索引,并且还需要更新
计数
列,该列表示它的使用次数。这是symfony的表单处理部分,但到目前为止,tutos还没有涵盖如此复杂的用例(尽管我已经阅读了许多在线资源)。嘿,我知道这些细微差别。我只是觉得你想用手来处理它们,而不是用别人的插件。是的,你是对的,我想用手来处理它们,因为还有其他一些类似的情况,它们没有现成的相关插件。你有没有考虑过这可能不可能用教义?这个问题您已经问了好几次了,结果发现您可以让代码实际工作,而不是追求SQL的纯度。有一个简单的解决方案需要更多的查询,但这可能是使用ORM的折衷。我想这应该是可能的,正如@Steve所指出的。你能详细说明你提到的解决方案吗?而且,我认为这是一个如此频繁的用例,ORM应该没有理由错过,但是相关的信息其实并不多……为什么不选择现有的标记(
“SELECT tags.*WHERE tags.name IN(“.infrade(“,”,$tags)。”;“
)并迭代地将提交的标记字符串与每个标记字符串进行比较,并相应地更新/插入?因为这不是symfony(或者可能是ORM)的样式处理用户提交的数据。请参阅我的第二条评论@Steve。从OOP的角度来看,
tags
insert/update
显然应该在
tags
模型的
save
方法中处理。