kalshah/dynamic-relations-includes

动态包含API请求的资源关系

1.2.0 2020-05-09 21:52 UTC

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

 

您可以使用字符串或数组作为includeinclude_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_accountswww.example.com/profiles?include=socialMediaAccounts

进一步说明

  • 必须将loadableRelationsloadableRelationsCount数组设置在您希望加载其关系的模型上。
  • 这两个数组都是为了限制应该加载哪些关系而创建的,这样可以防止动态加载可能包含敏感数据的所有关系。

测试

您可以使用以下方式运行测试:

./vendor/bin/phpunit