Php 总是用拉威尔的口才?
始终使用Laravel Elotent而不是原始SQL有什么好处吗 我有一个习惯,首先在phpMyAdmin中编写SQL来检查关系,然后将其翻译成雄辩的ORMPhp 总是用拉威尔的口才?,php,laravel,eloquent,Php,Laravel,Eloquent,始终使用Laravel Elotent而不是原始SQL有什么好处吗 我有一个习惯,首先在phpMyAdmin中编写SQL来检查关系,然后将其翻译成雄辩的ORM 有时,翻译成雄辩的ORM是痛苦和耗时的,尤其是从长而复杂的SQL查询进行翻译。与使用雄辩的ORM相比,我能够用SQL快速编写。没有问题,如果适合您,您应该使用原始SQL。Eloquent的目标是简化查询 你唯一需要注意的是准备好一切。使用查询生成器最重要的好处是抽象,这通常会减少代码。此外,由于构建器不依赖数据库,因此它允许无缝地切换RD
有时,翻译成雄辩的ORM是痛苦和耗时的,尤其是从长而复杂的SQL查询进行翻译。与使用雄辩的ORM相比,我能够用SQL快速编写。没有问题,如果适合您,您应该使用原始SQL。Eloquent的目标是简化查询
你唯一需要注意的是准备好一切。使用查询生成器最重要的好处是抽象,这通常会减少代码。此外,由于构建器不依赖数据库,因此它允许无缝地切换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]);
在使用使用用户输入的原始查询时,需要考虑的重要事项是始终使用绑定,以避免将您自己留给用户
也就是说,在某些情况下,正如您所说的,将查询转换为使用查询生成器是一件痛苦的事情,因为该生成器具有与数据库无关的限制
使用原始查询没有问题。对于需要雄辩模型的简单查询和需要更复杂操作的原始查询,我通常使用查询生成器和原始查询的组合,其中不在任何地方使用
DB::raw
仅仅是为了使用查询生成器是有意义的。因此,考虑到我上面所说的,这实际上可以归结为偏好。这个人什么时候有资格获得赏金,我想现在给出这个答案,我认为这是一个非常完整的回答,但不要忘记(从安全角度讲),对于原始SQL,您总是会接触到,但是对于像ORM这样的雄辩,由于所有的SQL调用都是封装的,并且有一个抽象层,所以您几乎可以忘记这个问题。@soutone非常正确,这就是为什么在我的示例中,我展示了使用绑定的原因。但是这很重要,所以我会在我的回答中包括警告。谢谢你指出这一点。