2010-03-06 26 views
-1

帖子標籤許多一對多關係(非常像計算器),所以代碼做沒有ORM應該是:如何通過教條(在symfony中)處理m2m關係(帖子和標籤)?

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

如何使用做通過學說?

假設相關的類已經從架構

的難點在於on duplicate key update部分產生的。

爲了進一步步驟,它可以更加困難,當有人正在編輯posts ...

+0

你認爲它可能不適用於教條?你已經多次提出這個問題了,它會發生,而不是針對SQL的純度,你可以讓代碼實際上只是* work *。有一個簡單的解決方案需要更多的查詢,但也許這是使用ORM的折衷。 – Raise 2010-03-07 15:44:34

+0

我猜這應該是可能的,正如@Steve指出的那樣。你可以詳細說明你提到的解決方案嗎?另外,我認爲這是一個非常頻繁的用例,ORM應該沒有理由錯過,但相關信息其實並不那麼重要... – user198729 2010-03-07 15:52:16

+0

爲什麼不選擇現有的標籤(''SELECT tags。* WHERE tags.name IN('.implode(「,」,$ tags)。');'')並將提交的標籤字符串與每個迭代,並相應地更新/插入? – Raise 2010-03-07 17:43:31

回答

1

而不是自己管理這種關係,你可能要考慮使用sfDoctrineActAsTaggablePlugin,這可能會讓你的生活更容易處理。

+0

謝謝!但你能簡要描述處理這些事情的原理嗎?因爲我必須處理幾個其他類似的問題... – user198729 2010-03-07 14:28:35

+0

我花了一些時間閱讀代碼,它使用'$ post-> addTag(' toto');'處理'tags',它不利用sfForm,它使用'bind' API來自動化很多東西,因此我們只需要修改相關的'model'類。結論, **行爲不是用戶提交的數據**的適當工具,它更適用於自動生成的東西,如TimeStampable,可版本化 – user198729 2010-03-07 17:32:40

0

對我而言,它看起來很容易。

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

爲什麼不read manual第一?也請考慮用symfony doctrine:generate-module post Post生成模塊並仔細閱讀生成的代碼。

+0

似乎你不明白我描述的用例嗎?在你的代碼中沒有插入新標籤的邏輯'到數據庫中,'tags'表在'name'列上有一個**唯一索引**,並且還需要更新'count'列,它表示它被使用的次數。它是**表單* *處理symfony的一部分,但目前爲止,tutos尚未涉及如此複雜的用例(我已閱讀過雖然..)粗略許多網上資源)。 – user198729 2010-03-07 14:33:00

+0

嘿,我知道這些細微差別。我只是認爲你想用手處理它們,而不是使用某人的插件。 – develop7 2010-03-07 16:28:06

+0

是的,你是對的,我想用手處理它們,因爲還有其他幾個類似的情況,它們沒有準備好相關的插件。 – user198729 2010-03-07 16:43:53