失败 / laravel-resourceable
从模型本身访问模型的底层资源
Requires
This package is auto-updated.
Last update: 2024-09-13 18:32:27 UTC
README
Laravel Resourceable 允许您在 Eloquent 模型和其关联的资源之间设置清晰的关系:**模型拥有其资源**。
截至 Laravel 9.5,这仍然不是很明显。确实有一个默认路径来存储主模型的资源,但您仍然需要像 new UserResource($user)
这样的操作。也就是说,您只是创建了一个特定资源的实例,并将模型作为参数传递。您甚至可以传递其他类型的模型,或者甚至传递不是 Eloquent 模型的东西(在合理范围内),一切都会正常工作。
使用这个包,我们使关系明确,并更改代码以反映一个模型的 JsonResource 属于该模型,而不是反过来。
用法
使用 HasResources
特性和在您的模型中实现 Resourceable
接口。
# App\Models\User use Faliure\Resourceable\Contracts\Resourceable; use Faliure\Resourceable\Traits\HasResources; class User implements Resourceable { use HasResources; }
获取单个模型的关联资源
$user = User::first(); // Without Resourceables $resource = new UserResource($user); // With Resourceables $resource = $user->resource();
获取模型的所有资源
// Without Resourceables $users = User::all(); $resources = UserResource::collection($user); // With Resourceables $resources = User::resources();
获取给定模型资源的自定义集合
// Without Resourceables $users = User::where('some', 'constraint')->get(); $resources = UserResource::collection($users); // With Resourceables $resources = User::resourcesQuery()->where('some', 'constraint')->get();
如您所见,这种语法糖使模型成为焦点,资源作为其许多关联实体之一。
定制
默认情况下,Resourceable 假设您的主要模型 JsonResource 遵循标准
- 用户的主要资源是
App\Http\Resources\UserModel
如果情况不是这样,您可以在 Resourceable 模型中定义一个属性 resourceClass
,如下所示
class User implements Resourceable { // ... protected string $resourceClass = TheResourceClass::class; }
此外,您可以通过将可选的 $resourceClass
参数传递给接口中定义的任何方法,为模型获取不同类型的资源。具体来说
$resource = $user->resource(SomeOtherResourceType::class); $resources = User::resources(SomeOtherResourceType::class); $filteredResources = User::resourcesQuery(SomeOtherResourceType::class) ->where('some', 'constraint') // ->... ->get();
就是这样简单!
resourcesBuilder
如何工作?
resourcesBuilder
是一个自定义的 Eloquent Builder,它允许您像通常一样编写 Eloquent 链,但它修改了最终结果,以返回关联的资源而不是模型或其集合。
有关更多信息和其他用法,请查看 faliure/laravel-custom-builder。