Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 拉雷维尔口若悬河——效率低下吗_Php_Mysql_Laravel_Eloquent - Fatal编程技术网

Php 拉雷维尔口若悬河——效率低下吗

Php 拉雷维尔口若悬河——效率低下吗,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,我正在考虑与Laravel一起开发一个新网站。我正在阅读一篇关于使用Eloquent连接表和检索数据的教程。在最后一个示例中,他们实际上是在尝试进行连接,但仍然有说服力的是执行两个查询,而不是一个查询。雄辩是低效的还是仅仅是一个糟糕的例子?这似乎可以简单地通过一个左连接查询完成。有人能对此提供一些见解吗?是否有更好的方法执行此查询?具体的例子是: Route::get('/', function() { $paintings = Painting::with('painter')->

我正在考虑与Laravel一起开发一个新网站。我正在阅读一篇关于使用Eloquent连接表和检索数据的教程。在最后一个示例中,他们实际上是在尝试进行连接,但仍然有说服力的是执行两个查询,而不是一个查询。雄辩是低效的还是仅仅是一个糟糕的例子?这似乎可以简单地通过一个左连接查询完成。有人能对此提供一些见解吗?是否有更好的方法执行此查询?具体的例子是:

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;
}