编程

使用 Tinkerwell 编写并调试 Eloquent 查询

448 2023-07-22 15:00:00

作为 Laravel 开发者,你每天都在编写 Eloquent 查询。这些查询可能是简单插入一条新记录或者使用多个关联和依赖进行复杂的 select。本文将探讨 Tinkerwell 带来的选项,以使您更容易完成这一过程。

Tinkerwell 允许你在应用上下文中运行代码,而不必一直转换到浏览器去测试代码。当编写 Eloquent 查询时,它允许你在每个额外条件添加到查询后运行查询。

假定你运行一个开发人员的在线社区,社区中有留言板和高级视频教程的平台。有一项任务,您希望导出所有拥有至少一门高级课程但也经常使用留言板的用户,并向他们发送一些您社区的贴纸。

让我们首先在本地开发环境中编写 Eloquent 查询,这样就不会有破坏生产数据的风险。在 Tinkerwell 中导航到项目的根目录,然后打开应用程序。Tinkerwell 将自动引导您的应用程序并导入所有必需的类,所以让我们立即开始编写查询。

Tinkerwell 适用于任何环境。因此,如果你没有直接在系统上使用 PHP,你可以连接到Docker容器、虚拟机甚至 Laravel Vapor。当使用远程设置时,通过 SSH 连接即可。今年夏天晚些时候,Tinkerwell 还将在远程环境中支持 Docker。

User::count()

现在我们可以看到 Tinkerwell 已经启动了该应用程序,它会返回我们有多少用户。让我们筛选数据库中至少有一个订单的所有用户。

use App\Models\User;
 
User::whereHas('orders')->count()

处理数据筛选之前,我们可以使用 Tinkerwell 的魔术注释,在不改变代码片段结果的情况下,在运行时添加行内调试输出到脚本中。我们可以在行尾添加 //?, 或者使用 /*?->*/ 语法进行行内函数调用。

use App\Models\User;
 
User::whereHas("orders") /*?->count()*/
  ->whereHas("posts")
  ->count(); //?

这验证了我们的查询是否有效,并显示了每一步之后还剩多少用户。

下一步,我们将过滤结果,只包括过去没有获得 swag 的用户。在模型级别上,swag 列是一个 datetime,这样我们就可以看到他们最后一次交货的时间。

use App\Models\User;

User::whereNull('swag')
  ->whereHas("orders") /*?->count()*/
  ->whereHas("posts")
  ->count(); //?

Tinkerwell 使用表模式使将数据导出到 CSV 文件变得非常简单。只要代码片段的结果是数组或集合,就可以在表视图中显示它,并使用UI中的列对结果进行排序。

在我们的示例中,导出带有地址的用户列表是有意义的,因此我们从他们的最后一个订单中获取地址,并将结果映射到集合。

use App\Models\User;
 
User::whereNull("swag")
  ->whereHas("orders")
  ->whereHas("posts")
  ->get()
  ->map(function ($user) {
    $currentAddress = $user->orders()->latest()->first();
    return [
      "name" => $user->name,
      "street" => $currentAddress->address,
      "city" => $currentAddress->city,
      "postcode" => $currentAddress->postcode,
      "country" => $currentAddress->country
    ];
  });

这是我们 swag 团队的最终列表,我们可以在不更改应用程序的情况下创建导出。

导出用户后,我们将使用 Tinkerwell 更新他们,并将他们的最新 swag 交付日期设置为 now()。

use App\Models\User;
 
User::whereNull("swag")
  ->whereHas("orders")
  ->whereHas("posts")
  ->update([
    'swag' => now()
  ])

在验证我们的脚本按预期工作后,我们可以直接在生产中运行它们,也可以决定先将它们保存为片段。Tinkerwell 支持您在 Tinkerwell 中保存和管理的本地代码段,您可以通过按 Shift+Ctrl/Cmd+P 并搜索代码段或共享代码段的标签从命令调色板打开这些代码段。您可以通过将代码片段保存到项目中的 .tickewell/sippet 目录来共享该代码片段,当您连接到应用程序时,tinkerwell会自动加载该代码片段。

要在生产环境中运行代码并实际导出客户列表,可以使用 Tinkerwell 的SSH连接管理器为应用程序添加远程环境。如果您使用 Laravel Vapor,只需在侧边栏中选择Vapor选项,然后选择您的生产环境。

Tinkerwell 让这样的任务变得超级简单,当你开始定期使用它时,你会发现 Tinkerwell 可以在其他几十种场景中加快你的工作流程,让编码变得更加愉快。您可以简单地使用Laravel助手来生成UUID或slugs、调度作业或通过HTTP门面玩API。

当你拥有 Tinkerwell 许可证时,你可以期待每月更新,包括改进、错误修复和新功能。在过去的12个月里,Tinkerwell获得了超过25次更新,这些更新包括共享片段、新主题、碰撞支持等等。

如果您还没有Tinkerwell许可证,您可以单击此处,在结账时使用代码LARAVEL-NEWS,并在本周获得10%的Tinkerwell折扣。