kalshah / dynamic-relations-includes
动态包含API请求的资源关系
Requires
- illuminate/http: ~5.6.34|~5.7.0|~5.8.0|^6.0|^7.0
- illuminate/support: ~5.6.34|~5.7.0|~5.8.0|^6.0|^7.0
Requires (Dev)
- illuminate/database: ~5.6.34|~5.7.0|~5.8.0|^6.0|^7.0
- orchestra/testbench: ~3.6.0|~3.7.0|~3.8.0|^4.0|^5.0
- phpunit/phpunit: ^7.0|^8.0|^9.0
This package is not auto-updated.
Last update: 2024-09-29 20:39:49 UTC
README
此包允许您根据请求动态包含资源关系和关系计数。这样,您只需要在需要时加载关系,这将提高您的API性能。
安装
此包可以通过Composer安装
composer require kalshah/dynamic-relations-includes
对于 Lumen,过程相同,但您需要添加辅助函数 request()。以下是代码:https://github.com/albertcht/lumen-helpers/blob/master/src/helpers.php#L417。
用法
基于请求包含关系
例如,我们有一个返回帖子列表的API请求,我们想在响应中包含每个帖子的评论。
为此,您首先需要在您的Post
模型上使用IncludeRelations
特质,并且您需要将comments
关系添加到loadableRelations
数组中,以便特质可以为您加载它。
namespace App; use Illuminate\Database\Eloquent\Model; use Kalshah\DynamicRelationsInclude\IncludeRelations; class Post extends Model { use IncludeRelations; protected $loadableRelations = ['comments']; public function comments() { return $this->hasMany(Comment::class); } }
现在您可以通过添加include
数组参数来发送请求,如下所示:www.example.com/posts?include=comments
基于请求包含关系计数
例如,我们有一个返回帖子列表的API请求,我们想在响应中包含每个帖子的评论计数。
为此,您首先需要在您的Post
模型上使用IncludeRelations
特质,并且您需要将comments
关系添加到loadableRelationsCount
数组中,以便特质可以为您加载它。
namespace App; use Illuminate\Database\Eloquent\Model; use Kalshah\DynamicRelationsInclude\IncludeRelations; class Post extends Model { use IncludeRelations; protected $loadableRelationsCount = ['comments']; public function comments() { return $this->hasMany(Comment::class); } }
现在您可以通过添加include_count
数组参数来发送请求,如下所示:www.example.com/posts?include_count=comments
您可以使用字符串或数组作为include
和include_count
参数
-
作为字符串使用,包含多个包含项:
www.example.com/posts?include=comments,tags
-
作为数组使用,包含多个包含项:
www.example.com/posts?include[]=comments&include[]=tags
使用不同类型的关系和约定
- 您可以包含嵌套关系,例如加载评论和每个评论的创建者
protected $loadableRelations = ['comments', 'comments.creator'];
并使用以下方式请求:www.example.com/posts?include=comments.creator
-
您可以包含并使用驼峰式命名的关系,将其添加到数组中,使用其确切名称
namespace App; use Illuminate\Database\Eloquent\Model; use Kalshah\DynamicRelationsInclude\IncludeRelations; class Profile extends Model { use IncludeRelations; protected $loadableRelationsCount = ['socialMediaAccounts']; public function socialMediaAccounts() { return $this->hasMany(socialMediaAccount::class); } }
然后使用以下任一方式包含它:
www.example.com/profiles?include=social_media_accounts
或www.example.com/profiles?include=socialMediaAccounts
进一步说明
- 必须将
loadableRelations
和loadableRelationsCount
数组设置在您希望加载其关系的模型上。 - 这两个数组都是为了限制应该加载哪些关系而创建的,这样可以防止动态加载可能包含敏感数据的所有关系。
测试
您可以使用以下方式运行测试:
./vendor/bin/phpunit