【问题标题】:Building a REST API in Laravel在 Laravel 中构建 REST API
【发布时间】:2016-01-28 06:24:06
【问题描述】:

我正在从无框架开发到第一次接触 Laravel(使用 5.1 版),我有点不知所措要处理的东西的数量(迁移、种子、heatoas、变压器、单元测试、错误处理等)。

我想在返回其中的 show method 部分时获得一些帮助(遵循 REST 概念)。我有以下数据库结构:

公司 -> 用户 -> 工单 -> 交互 -> 附件

现在,当列出特定工单(如GET /customers/5/tickets/3)时,屏幕需要显示该工单的所有交互,以及工单表中的所有信息(有点像页眉)和每个用户的姓名创造了特定的互动。

从关系的角度考虑,我应该从单个调用中返回所有数据,还是应该将票据表中的信息(例如,来自index method 调用)保留在前端?即使我应该保留票证信息(页面标题),我仍然为每次交互留下interaction join users + N 个附件。有哪些方法可以解决这个问题?

我决定打开这个帖子,因为我正在尝试对这个调用进行单元测试,但我无法决定是否应该为数据库播种以获取它工作所需的所有信息。

编辑

为了更好地阐明我的要求,我对如何处理数据库通信没有任何疑问,我已经有了扩展 Eloquent 类的模型集,并定义了 hasMany、belongsTo 等数据。

namespace App\Models;

class Company extends Model {

    /**
     * Get the users from the company.
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function users() {
        return $this->hasMany('App\Models\User');
    }
}

为了不让帖子变得比需要的大,我将只提供公司模型。希望大家明白我有CompanyUserTicketInteractionAttachment 模型全部设置好并可以使用。

编辑 2

问题在于处理它的做法。如果GET /customers/5/tickets/3 返回ticket 记录、它的所有交互、每次交互的用户、所有附件 对于每个交互?这不是对单个端点负责吗?就像我上面提到的,我想我可以要求前端从前端列出所有票时开始保留票信息,这样可以减轻 ticket 记录的负担,但它仍然是一个 TicketController,还有很多数据要加载。我正在寻求有关处理这么多信息的建议,因为我以前从未这样做过,并且我希望尽量减少我会后悔的事情。

【问题讨论】:

  • 在 laravel.com/docs/5.1 上了解 Eloquent ORM。您需要为每个模型创建模型,在它们之间创建关系,然后使用这些关系来查询数据(获取或发布)。在那之前忘记其他的事情。
  • 我已经拥有了你刚才提到的一切。
  • 我不确定你在问什么。您将需要一个控制器。该控制器将具有功能,其中之一将是您的 json api 调用入口点。该函数将返回一个 json blob,它在 laravel 中是通过返回一种响应对象来完成的。该函数内部是一些用于从数据模型中提取数据的代码。该函数通过路由访问。您需要哪方面的帮助?
  • @delatbabel 我又编辑了。
  • @MarcoAurélioDeleu 在更一般的建议中,对于学习像 Laravel 这样强大但复杂且抽象(有时还有些粗糙)的框架,我发现放慢速度,专注于一件特定的事情,学习正确的方法,然后继续下一个挑战。这比试图一次性弄清楚所有事情对你的帮助要好得多。

标签: php rest unit-testing laravel-5


【解决方案1】:

我认为您应该返回您的 API 使用者显示一个票据条目所需的所有信息。我从事过一些项目,其中有查询参数来告诉服务器要包含哪些相关模型,以及其他需要后续 AJAX 调用来获取关联数据的项目,但我认为这是不必要的复杂,除非交互数据很大或很少需要。

我建议为每个模型创建视图局部视图,以便在一个大视图无法正常工作的情况下具有灵活性。

解决您提到的 N+1 查询问题是微不足道的。这是eager loading 的完美情况。

试试这样的:$tickets = Tickets::with('interactions','user')->get()

这将在一个查询中加载所有相关数据。

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2011-08-11
    相关资源
    最近更新 更多