2015-11-28 42 views
3

使用Laravel Eloquent而不是原始SQL是否有任何優勢?一直使用Laravel雄辯?

我有一個習慣,首先在phpMyAdmin中編寫SQL來檢查關係,然後翻譯它雄辯的ORM。

某些時候翻譯成雄辯的ORM是痛苦和耗時的,特別是從冗長的複雜SQL查詢翻譯過來。我能夠比使用Eloquent ORM在SQL中寫得更快。

+1

當是賞金這個資格,我想現在這個答案 – davejal

回答

5

使用查詢生成器的最大好處是抽象,這通常會導致代碼更少。另外,因爲構建器是數據庫不可知的,所以它允許無縫切換RDBMS,例如從MySQL到PostgreSQL(但是這僅適用於某些情況,因爲有些事情是數據庫特定的並且不能被抽象)。

結合使用它雄辯提供其轉換成口才模型得出的結果,這意味着您可以使用關係,存取器,訪問器和所有的口才車型提供的其他好處的好處。例如:

$users = DB::select('select * from users'); 

將返回stdClass對象的數組,而以下幾點:

$users = User::all(); 

將返回洋洋灑灑模型的集合上,您可以得到關係:

foreach ($users as $user) { 
    $user->projects(); 
} 

或者進行更改並保存輸入:

$user->name = 'Bob Dylan'; 
$user->save(); 

這些東西可以用生查詢方法來完成,通過手動創建的模型的集合,像這樣:

// Replace the stdClass items with User models 
foreach ($users as &$user) { 
    $user = new User($user); 
} 

// Create a Collection with the results 
$users = new Illuminate\Support\Collection($users); 

但它增加了它已經被雄辯實施的複雜性。


的抽象如何導致更少的代碼,一個很好的例子是這樣的:

User::whereIn('id', [1, 7, 100]); 

這比相當於少代碼:

DB::select('select * from users where id in (?)', [implode(',', [1, 7, 100]); 

參加審議的重要的事情當使用使用用戶輸入的原始查詢時,始終使用綁定以避免讓自己打開到SQL Injection


話雖這麼說,有些情況下,如你所說,這是一個痛苦的轉變查詢使用查詢生成器的情況下,因爲建築商給了它的數據庫無關的限制。

沒有與使用原始查詢沒有問題。我通常使用這兩種查詢生成器的組合對於需要雄辯的模型和更復雜的操作,在這裏是很有道理不使用DB::raw印花布只使用查詢生成器的地方生查詢簡單查詢。所以考慮到我上面所說的事情,它只是歸結爲真正的偏好。

+0

我認爲這是一個非常完整的響應,但不要忘了,有**生SQL(在安全性方面而言)**你總是暴露在[SQL注入](https://en.wikipedia.org/wiki/SQL_injection),但有** ORM像機鋒**,因爲所有的SQL調用封裝並有一個抽象層,你幾乎可以忘記這個問題。 – soutoner

+0

@soutoner非常真實,這就是爲什麼在我的例子中我使用綁定展示的最後一個例子。但是這是重要的,所以我會在我的答案中包含警告。感謝您指出。 – Bogdan

0

沒有問題,如果您更適合您,應該使用原始SQL。雄辯的目標是簡化查詢。

你唯一需要照顧的就是準備一切。