2010-12-20 30 views
1

也許我剛去過的完全無知解決我的問題,並地獄,也許它內置的...我只是一直沒能找到這樣的解決方案。過去兩週我一直在被動地看着,並積極在最後一天。如何處理symfony應用程序中的外鍵約束?

我怎樣才能優雅在symfony中處理外鍵約束?

我已經考慮捕捉異常(Doctrine_Connection_Exception)和假設這是一個外鍵約束,然後轉發用戶錯誤模塊與外鍵約束的動作。然而,代碼冗餘是非常殘酷的,即使我把它放到我的基本操作類中,也不得不在每次調用數據庫時都放置一個try-catch塊,這會變得很糟糕。 更不用說,對於外鍵約束的例外情況的假設是一個可怕的想法,因爲當存在SQL語法和實際連接錯誤時也會調用此異常。

我想過使用從異常類繼承的getPortableCode()和getPortableMessage()方法來確定它是否是外鍵約束(他們可以這樣做),但它們絕對不會提供任何信息關於約束本身。例如,當拋出一個約束異常時,getPortableCode()返回'-5',getPortableMessage()返回'already exists'。當然,如果存在單個約束條件,我可能會弄清楚失敗併爲用戶拋出錯誤,但是,當然,我已經使用多個約束使事情變得複雜。

反正夠我散漫的,我試圖找出什麼其他開發商都在我的情況做...看起來這應該是涵蓋在低迷的「溫柔的介紹。」

+1

我不太確定你想要達到的目標。爲什麼你想要在操作中處理外鍵?不是表單驗證你在找什麼? – 2010-12-20 07:39:23

回答

0

的這個問題的答案取決於什麼創建數據庫條目。

如果答案是一個表單提交,你應該使用的Symfony的驗證系統。 Doctrine提供驗證器來檢查關係是否有效或存在對象。看看sfValidatorDoctrineChoice和sfValidatorDoctrineUnique。

如果你沒有根據用戶的輸入創建數據庫的條目,這裏的解決方案是執行檢查自己,無論是通過驗證器或手動DB調用。我想你也可以嘗試/捕捉。

+0

我已經使用用戶輸入的表單驗證。但是有數據進入驗證過程,我可以出於某種原因將其放入驗證程序。我結束了剛剛覆蓋模型的保存方法,以便檢查這些特定列是否要更新,然後進行驗證。 – 2010-12-22 00:02:05

+0

我到達的解決方案正是緊跟着這個......真的沒有「優雅」的方式來處理業務層中的外鍵。所以,我只是使用驗證器來確保我需要的特定唯一性,而任何落入裂縫的東西都會引發異常。我必須承認,爲了讓事情變得更清潔,我做了很多事情。 – 2011-03-05 01:54:54