【问题标题】:Php: Saving Server resources - theoreticalPHP:节省服务器资源 - 理论上
【发布时间】:2019-01-22 17:16:06
【问题描述】:

(使用 Laravel) 我已经在我的表中保存了行。更新时,如果我取消选中复选框,则该值必须重置为默认值。所以我的复选框只接收选中的值,我从数据库中获取所有行并首先将它们设置为默认值,然后我只为选中的行设置所需的值。这是在 2 行代码中完成的,

\DB::table('tablename')->where('val', '=', $id)->update(['val' => 0]);
  \DB::table('tablename')->whereIn('id', $request->checked)->update(['val' => $id]);

这是一种方法,但对我来说,当我只需要设置默认值时,将所有行设置为默认值是很糟糕的。另一种选择是使用 foreach,我不喜欢在控制器中使用它。所以问题 1(理论和重要) - 哪个需要更多资源 - 巨大的 sql 或 foreach? Q2(实用)- 考虑到它的 Laravel,你将如何解决这个问题

【问题讨论】:

  • 我怀疑 foreach 的性能会更好,即使您将它包装在单个事务中,您也将执行 n+1 个查询而不是 2 个。
  • 你想要 where 和 whereIn 的区别吗?
  • 我认为 where('id', '=', $id) 应该是 where('val', '=', $id) 在您查看此内容后的第一个查询中。

标签: sql laravel foreach resources


【解决方案1】:

您可以将 whereIn 的倒数添加到您的第一个查询中。

\DB::table('tablename')
    ->whereNotIn('id', $request->checked)
    ->where('val', '=', $id)
    ->update(['val' => 0]);

【讨论】:

  • 绝对。当你知道 - 你知道。您如何看待资源节约问题?最近我开始非常关心如何让代码更智能。如果有人知道如何使用更少资源并获得最大结果的任何文章,请分享。
  • @DimaRashevskiy,我最大的建议是先编码,然后再担心性能。在某些情况下,您需要关注性能,例如长页面加载,但在 Web 应用程序中,大多数情况下,您处理的是短暂的请求,一点额外的 cpu 或内存将比开发便宜时间。一旦获得数百万次点击,就开始重构以提高性能。
  • 当然,当您工作时,时间就是金钱。但这是我自己做项目的情况,不用着急,探索更重要。现在我知道如何使用像你这样的查询(谢谢)并且会减少 foreach,但是,最好在有人看到它并说有更好的解决方案之前做正确的方式
  • 如果他们发现了就好了,这就是代码审查的重点,也是为什么开源项目如此有益,其他编码人员总能找到更好的方法来做事。不要试图做到完美。
  • 谢谢。如果我有一个值数组并且我想在没有实际 foreach 的情况下插入一行 foreach 数组元素怎么办?可以使用查询生成器吗?我实际上希望一行有 2 个值,一个是相同的,第二个是数组,所以就像 $val1 = 1; $val2 = [];和 $val2 的 foreach 元素我需要插入 $val1 和 $val2[] ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 2020-01-31
相关资源
最近更新 更多