php sql好处,关于php:使用Doctrine与SQL相比,使用DQL有什么好处?
當在使用Doctrine類時需要自定義查詢時,有人可以為我提供一些明確的理由(支持事實)來使用/學習DQL與SQL嗎?
我發現,如果無法使用ORM的內置關系功能來實現某些目標,通常會在擴展的Doctrine或DoctrineTable類中編寫自定義方法。在這種方法中,用直接的SQL編寫所需的代碼(使用帶有適當準備好的語句/注入保護的PDO等)。 DQL似乎是一種似乎無法學習/調試/維護的其他語言,它提供了足夠的令人信服的理由來在大多數常見情況下使用。 DQL似乎并沒有比SQL復雜得多,因此可以保證使用它-實際上,我懷疑您是否可以在沒有扎實的SQL理解的情況下有效地使用DQL。在將與PHP一起使用的最常見數據庫中,大多數核心SQL語法端口都相當不錯。
我想念/忽略什么?我敢肯定有一個原因,但是我想聽聽那些有意大量使用它的人的消息,以及嘗試使用純OLE SQL帶來的收益。
我不是在尋找支持ORM的參數,只是在傳統的LAMP設置(使用mysql,postgres等)中需要執行核心"按關系獲取"類型需求時執行的DQL。
我沒有事實支持的參數,但是我發現名稱關系比連接條件更易于使用,出錯的幾率更低,編寫起來也很乏味。
老實說,我使用Doctrine1.2學習了SQL :)我什至不知道外鍵,級聯操作,諸如group_concat之類的復雜功能以及許多其他東西。索引搜索也非常好用,可以直接使用。
DQL更加容易編寫和理解代碼。例如,此查詢:
$query = ..... // some query for Categories
->leftJoin("c.Products p")
它將在類別和產品之間進行左連接,而您不必在p.category_id = c.id上寫。
而且,如果將來您將關系從一個2到許多更改為很多2,那么這個查詢將可以正常工作。教義將對此予以照顧。如果要使用SQL進行此操作,則必須更改所有查詢以包括該中間多2多次表。
+1,尤其是對象之間的關系(外鍵)已在Base類中連接
Ive收到的回復中的@Zeljko,關于改變人際關系類型的答案中的最后一點是我所遇到的唯一令人信服的問題。我不太關心為什么它對那些不了解關系型數據庫如何工作的人有益-從長遠來看,對初學者來說并不總是最好的。另外,由于您注意到ON子句...有時您希望在ON子句中添加除鍵之外的其他條件-據我所知DQL不支持該條件。那是您需要完成的大多數工作的簡單示例,但是在某些情況下卻很難使用。
沒錯,您將有其他條款。對于這種情況,DQL提供了WITH語句。是的;一個人也可以與一對一,一對一,一對二,很多,許多二,許多...一起工作,而無需更改代碼。我的建議:嘗試一下。一旦上鉤,就再也回不去了。就像駕駛頂級梅賽德斯車隊與最底層的Yugo車隊一樣。兩者都會把你從A點帶到B點,但是我看不到Yugo形成的線。
@Zeljko,對我來說,這是比較錯誤的比較。 :)我從來沒有說過,與普通的舊SQL相比,使用DQL可以實現更多或更多的穩定結果,或者更加輕松。也許是出于一些基本需求。它更多地是自動和手動檔之間的比較。
我發現DQL更具可讀性和方便性。如果正確配置,連接對象將更容易,查詢也將更容易編寫。
您的代碼將很容易遷移到任何RDBMS。
最重要的是,DQL是對象模型而不是關系模式的對象查詢語言。
我認為您的第一個是定性的-我已經看過真正復雜的DQL來完成簡單的SQL查詢可以解決的任務。您的第二點我完全同意,但是正如我的問題中所指出的,它不涉及實現DQL可以完成的所有工作所需的基本SQL。最后一點是最令人信服的方式。好的,它是對象而不是基礎存儲的查詢語言。什么是對象查詢語言的核心優勢?它會提高性能嗎?它是否支持經過嚴格審查的OO模式?它允許更有效/更好的代碼嗎?
@Ray在使用Doctrine 1.2之后,對性能確實有害。
你們有什么參考資料來理解教義生成的模型類(TestTable,BastTest,Test),以及如何正確處理它們,在控制器中調用誰?你能拜訪我的問題stackoverflow.com/questions/11529224/
Zeljko的答案很明確。
使用DQL而不是原始SQL的最重要原因(在我的書中):Doctrine將實體與實體在數據庫中的保存方式分開,這意味著實體不必隨著基礎存儲的更改而更改。反過來,這意味著,如果您希望對基礎存儲進行更改(即重命名列,更改關系),則無需觸摸DQL,因為在DQL中,您使用實體屬性代替(這只會發生根據您的當前映射在幕后翻譯以更正SQL)。
在過去一個月開發了一個應用程序并對數據庫進行了許多更改之后,我同意這個答案。
使用DQL可幫助您處理對象。
萬一插入到databae中,您將插入一個Object
$test = new Test();
$test->attr = 'test';
$test->save();
如果從數據庫中選擇,則將選擇一個數組,然后將其填充到對象中
public function getTestParam($testParam)
{
$q=Doctrine_Query::create()
->select('t.test_id , t.attr')
->from('Test t ')
$p = $q->execute();
return $p;
}
您可以查看教義文檔以獲取更多詳細信息
總結
以上是生活随笔為你收集整理的php sql好处,关于php:使用Doctrine与SQL相比,使用DQL有什么好处?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 旅游去
- 下一篇: bat文件打开一闪就没了_window文