2015-11-28 147 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。雄辩的目标是简化查询。

你唯一需要照顾的就是准备一切。