Php 拉雷维尔口若悬河——效率低下吗
我正在考虑与Laravel一起开发一个新网站。我正在阅读一篇关于使用Eloquent连接表和检索数据的教程。在最后一个示例中,他们实际上是在尝试进行连接,但仍然有说服力的是执行两个查询,而不是一个查询。雄辩是低效的还是仅仅是一个糟糕的例子?这似乎可以简单地通过一个左连接查询完成。有人能对此提供一些见解吗?是否有更好的方法执行此查询?具体的例子是:Php 拉雷维尔口若悬河——效率低下吗,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,我正在考虑与Laravel一起开发一个新网站。我正在阅读一篇关于使用Eloquent连接表和检索数据的教程。在最后一个示例中,他们实际上是在尝试进行连接,但仍然有说服力的是执行两个查询,而不是一个查询。雄辩是低效的还是仅仅是一个糟糕的例子?这似乎可以简单地通过一个左连接查询完成。有人能对此提供一些见解吗?是否有更好的方法执行此查询?具体的例子是: Route::get('/', function() { $paintings = Painting::with('painter')->
Route::get('/', function()
{
$paintings = Painting::with('painter')->get();
foreach($paintings as $painting){
echo $painting->painter->username;
echo ' painted the ';
echo $painting->title;
echo '<br>';
}
});
如果希望在单个查询中获取所有数据以使用联接,则必须将其指定为:
Painting::join('Painter as p', 'p.IdPainter', '=', 'Painting.IdPainting')->get()
如果你需要一些条件,那么:
Painting::join('Painter as p', 'p.IdPainter', '=', 'Painting.IdPainting')->where('cond1', '=', 'value')->get();
就个人而言,雄辩是低效的,我更倾向于这方面的原则。雄辩对于快速构建某些东西非常有用,并且还具有非常易于使用的查询缓存,但是对于需要随时间扩展的大型项目来说,它可能并不理想,我的方法是在合同中使用存储库模式,这样我仍然可以使用雄辩的力量,并且有一个系统,允许我在需要时轻松地更改实现。您的问题的简单答案是:不,这不是低效的 以豪尔赫所描述的方式使用雄辩真的违背了它作为ORM的目的 虽然您可以像示例中那样编写连接,但ORM的设计实际上并没有考虑到这一点 您给出的示例不是(循环中的每个项都有一个额外的查询运行,这是最糟糕的查询类型) 使用输出报告的两个查询并不是很大的开销,我认为您可以在生产中使用。在这种情况下,你应该使用雄辩的“with” n+1查询(您希望避免)的示例如下:
foreach (Book::all() as $book)
{
echo $book->author->name;
}
如果Book::all()
返回20本书,那么循环将总共执行21个查询。1获取所有书籍,1获取每个迭代的$book
作者姓名
将Elount与即时加载结合使用,再加上缓存,就足以将任何性能问题降至最低。我在这方面没有权威,但在我看来,Elount总是比直接与数据库对话慢,因为创建查询时会有开销,然后将所有结果绑定到您使用的任何模型的实例。无论如何,这不会是一笔无法承受的开销,但它会以某种形式存在。您希望新项目的负载是什么?您始终可以创建视图,并拥有只读的雄辩模型,以便轻松访问数据库。我想说的是,eloquent不会执行连接,因为每个模型都是独立的,您可以更新每个模型,而不考虑它们之间的任何类型的关系,这可能是它选择执行两个查询以便更轻松地映射到对象的原因。再说一次,我可能是错的,但事实是——如果你想要一个连接,一个查询以及雄辩的所有好处——你可以做到。我还没有做出任何最终决定。在以前的项目中,我总是手工编写查询,所以我并不反对。一位朋友最近吹嘘说口才是多么容易,但当我能很快地提出问题时,我并没有看到真正的优势。我们期待一些复杂查询的加载,因此效率将是重要的。您将更快地使用雄辩。并不是说查询很难构造,Eloquent为您所做的是使您能够在一组表上快速执行crud。我是凭经验说话的,因为办公室的人几个星期来一直试图说服我,雄辩和条理战胜了手工质疑。在我屈服之后,我可以保证使用ORM肯定会帮助你更快地开发,最好的部分是你可以更容易地进行测试。有没有事实支持你关于雄辩与条令相比效率低下的说法,或者我们应该相信你的话?我喜欢相信一些我自己可以复制和看到的东西。你的回答在这方面没有帮助。如果你觉得条令有效,而雄辩低效,那你就做错了。我亲自跟我的雄辩家谈过,雄辩家没有达到我的期望。这篇评论来自经验,我当然很容易提出疑问,为什么我不反对,但是这不支持数据库中更复杂的结构,至少在本机上是一个复合键示例。
foreach (Book::all() as $book)
{
echo $book->author->name;
}