rasyidly/laravel-model-query

高级 Laravel 动态模型查询

v1.1.0 2023-12-29 17:22 UTC

This package is auto-updated.

Last update: 2024-09-29 18:59:08 UTC


README

高级 Laravel 动态模型查询

安装

使用 composer 安装此包

composer require rasyidly/laravel-model-query

用法

该包包括几个特性。要使用所有功能,请按照以下示例使用此 trait。

use Rasyidly/ModelQuery/ModelQuery;

class User extends Model
{
    /**
     * This will load Loadable, Searchable, Sortable, and Trashable Traits in single load.
     */
    use ModelQuery;
}

或者,手动作为 trait 使用单个功能

只需将功能/s 作为 trait 添加到您的模型中,例如。

use Rasyidly/ModelQuery/Loadable/Loadable;
use Rasyidly/ModelQuery/Searchable/Searchable;

class User extends Model
{
    use Loadable, Searchable;
}

特性

以下是该包的主要特性及其使用方法。

📃 可加载

Loadable 是一个 trait,用于根据模型中定义的 $loadable 属性加载 eloquent 关联,如下所示

class Post extends Model
{
    use ModelQuery;

    public $loadable = [
        'author.profile', 'commentable'
    ];

    public function author (): BelongsTo { ... }
}

如果关系定义中未找到该关系,则不会引发错误。除非您错误地定义了关系的定义,否则这是致命的。

然后,在控制器中使用,如下所示

预加载

// posts?load=author,commentable

$query = ['author', 'commentable'];

$posts = Post::loadable($request->query('load'))->get();

这将通过预加载生成包含关系 authorcommentablePost 集合/对象。如果加载多个关系,请确保查询之间用逗号分隔,以便 Loadable 根据 Loadable 的条款接受数组参数。

延迟加载

这与此相同,唯一的不同之处在于它将在成为对象时加载(而不是查询构建器,即 n+1)

// posts?load=author.profile

$post = Post::find(1);

$query = ['author.profile'];
$post = $post->loadable($request->query('load'));

这将根据 $loadable 定义加载 author.profile 关联。

📃 可搜索

Searchable 是一个 trait,用于根据模型中定义的 $searchable 属性搜索特定文本,如下所示

class Post extends Model
{
    use ModelQuery;

    public $searchable = [
        'title', 'description', 'author.name'
    ];

    public function author (): BelongsTo { ... }
}

使用此可搜索定义,按顺序,它将搜索包含 title like % ... % 的 Posts 集合,等等。您还可以使用类似于上面的示例中的关系,例如 author.name,这意味着它将在 author 关系中查找 name

然后,在控制器中使用,如下所示

// posts?search=Hello

$posts = Post::searchable($request->query('search'))->get();

上述语法的结果是搜索由 $searchable 定义的列中的帖子,在这种情况下,它将在 titledescription 列或 author 关系中的 name 中搜索 "%Hello%"

📃 可排序

可排序特性是一种通过 $sortable 属性中定义的列进行排序的方法,带有 ,asc,desc 的附加功能。

class Post extends Model
{
    use ModelQuery;

    public $sortable = [
        'name'
    ];
}

控制器中实现示例如下

// posts?sort=name,asc

$posts = Post::sortable($request->query('sort'))->get();

基本上,可排序与 Laravel 内置的 orderBy 方法完全一样,只是我结合了排序方法,无论是升序还是降序。此 trait 只接受两个升序或降序参数,否则它将忽略此方法,不会显示错误。

📃 可回收站

此 trait 仅在模型使用 SoftDeletes 时有效

没有与前面 trait 中的任何特殊属性。它只会添加一个特殊方法,即 trashable($default = 'without'),它只接受三个参数,即 withonlywithout

实现如下

// posts?trash=only

$posts = Post::trashable($request->query('trash'))->get();

查询和语法的结果是它将仅调用 Laravel SoftDeletes 的 onlyTrashed

贡献

贡献始终受到欢迎,只需打开问题、分支和/或拉取请求!由您决定!

许可证

此库是开源软件,受 MIT 许可证许可