Laravel资源

时间:2019-04-03 15:52:47

标签: laravel laravel-5 eloquent

我试图弄清楚如何在Laravel中使用React或Vue。最大的变化是使用json返回所有请求。

因此,我开始查找一些文档并找到有关API Resources的信息

现在我最担心的是,例如在我的应用程序中,我具有以下数据库结构:

  • 发票
  • 客户
  • Client_contacts
  • Client_contacts_phones

因此,客户可以有多个发票,因为他们可以有多个联系人,每个联系人可以有多个电话号码。

现在,我被困的原因是: 您可以拥有所有发票的列表视图,但是我希望在表字段之一中包含公司名称,并且使用同一资源文件在详细信息视图中具有完整的属性列表。

使用资源,我已完成以下操作:

发票集合:     

namespace App\Modules\Invoices\Resources;

use Illuminate\Http\Resources\Json\ResourceCollection;

class InvoicesCollection extends ResourceCollection
{
    public function toArray($request)
    {
        return [
            'data' => InvoiceResource::collection($this->collection),
            'meta' => ['invoice_count' => $this->collection->count()],
        ];
    }
}

发票资源:

<?php

namespace App\Modules\Invoices\Resources;

use App\Modules\Clients\Resources\ClientResource;
use Illuminate\Http\Resources\Json\JsonResource;

class InvoiceResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'invoice_id' => $this->invoice_id,
            'client' => new ClientResource($this->client),
            'finalized_at' => $this->finalized_at,
            'payed_at' => $this->payed_at
        ];
    }

    public function with($request)
    {
        return [
            'data' => [
                'client_billing' => $this->client_billing,
                'client_shipping' => $this->client_shipping,
                'line_items' => $this->lineItems,
                'notes' => $this->notes
            ],
        ];
    }
}

ClientsCollection:

<?php

namespace App\Modules\Clients\Resources;

use Illuminate\Http\Resources\Json\ResourceCollection;

class ClientsCollection extends ResourceCollection
{
    public function toArray($request)
    {
        return [
            'data' => ClientResource::collection($this->collection),
            'meta' => ['client_count' => $this->collection->count()],
        ];
    }
}

ClientResource:

<?php

namespace App\Modules\Clients\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class ClientResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'vat' => $this->vat,
            'contacts' => $this->contacts
        ];
    }

    public function with($request)
    {
        return [
            'data' => [
                'website' => $this->website,
                'phone' => $this->phone,
                'email' => $this->email
            ],
        ];
    }
}

为了明确起见,我正在使用with()函数。哪个状态:

  

有时您可能只希望包含某些内容   如果资源是最外部的,则具有资源响应的元数据   资源被返回。通常,这包括元信息   关于整个响应。要定义此元数据,请添加   资源类的方法。此方法应返回一个数组   仅在以下情况下将元数据包含在资源响应中:   资源是要渲染的最外面的资源


问题:

  1. 这是执行此操作的正确方法吗?当您要排除信息时 列表,并在详细视图上有所有信息?

  2. 还有更多控制权吗?如您在我的clientResource中看到的, 有联系人,在导入他们时,他们将拥有所有 信息。如果我添加联系人资源/收藏,那么我有第三个 层,这意味着我将无法使用 在同一“客户端详细信息”页面上的ContactResource with()。

0 个答案:

没有答案