此包最新版本(01.2)没有提供许可信息。

模型和实体的查询构建器。

01.2 2019-05-23 15:41 UTC

This package is not auto-updated.

Last update: 2024-09-16 10:28:57 UTC


README

由时尚档案构建

用途

创建查询的单一可管理位置,其中包含作用域。最初它们被放在每个表模型中,作为Laravel 作用域进行 Eloquent 查询。然后我们必须为其他位置构建特定的查询,因为这些作用域仅针对 Laravel。这些查询是在您可以使用原始 SQL 和参数构建 SQL 查询的任何 ORM 或原始 SQL 的位置创建查询。

基本使用

首先,您需要将 Qeto\QueryTrait 添加到任何您想查询的表模型上。这将连接到正确的文件夹结构。假设我们使用 App\User 并包含了这个特质。然后添加受保护的变量 $name 以作为类的名称。

public $name = 'User';

该文件随后连接到一个已创建的文件(在我们的案例中我们已经创建了它)App\Queries\UserQueries.php。首先您必须在您的 App\User 文件中扩展 Qeto\BaseQuery 类。一旦添加,您就可以开始添加任何查询作用域。让我们添加查询 byUsername,该查询通过用户名字段查询用户。

use Qeto\BaseQuery;

class UserQueries extends BaseQuery 
{
    protected $name = 'User';
    
    public function byUsername(string $parameter): array
    {
        return ['users.username = "?"', [$parameter]];
    }
}

此功能允许我们通过 byUsername 搜索用户模型。我们可以传递要使用的 sku 并查询模型。我们已经设置了绑定以进行安全。

要调用此函数,我们首先调用外观,并使用 qWhereRaw 获取原始 SQL 以及您需要调用的任何函数作为第一个参数,第二个参数是查询的参数。

user::qWhereRaw('byUsername', 'danodev');

反转

我们添加了反转,可以用于执行与您调用相反的操作。最初我们有两个单独的函数 byUsername 和 byNotUsername(检索没有该 sku 的用户)。现在,反转允许您在同一个调用中建立这一点。

use Qeto\BaseQuery;

class UserQueries extends BaseQuery 
{
    protected $name = 'User';

    public function byUsername(string $parameter): array
    {
        return ['users.sku ' . ($this->inverse ? '!' : '') . '= "?"', [$parameter]];
    }
}

现在调用 qIWhereRaw 函数将获取 byUsername 的反转。

用作 eloquent 作用域

要作为 eloquent 作用域使用,您只需像调用作用域一样调用函数,但不要调用原始版本

User::qWhere('byUsername', 'danodev')->get();

这允许您附加其他作用域并使用其他 eloquent 方法。

创建子文件夹

将所有查询添加到一个文件中将使类变得非常大。因此,您可以在文件中添加主类的子类,该文件使用命名空间命名。例如,假设我们想将用户类型移动到它们自己的文件,它们是用户类的子类。因此,您会创建一个 App\Queries\User 文件夹,并创建一个名为 userTypeQueries.php 的新文件,其中包含同名类并扩展 UserQueries 类。因此,现在假设我们将 byUsername 函数移动到 UserTypeQueries 类。要调用该类,您将文件名作为 qWhere 中声明的 camelCase 函数的第一个部分。

User::qWhere('typeByUsername', 'danodev')->get();

连接查询和制作 Or Where 语句。

如果您经常需要一起执行多个查询,可以使用 joinByAnd 函数将它们合并到一个作用域中。这样,您可以一次性使用合并后的查询。例如,我们持续寻找具有特定用户类型且在特定日期注册成为会员的查询。我们可以创建两个查询 byTypebyCreatedDay,并将它们合并成一个我们始终可以一起调用的查询。

joinByAnd 的语法是传入您想要调用的方法名称。然后,它以数组的形式接收您传入的每个参数。

use Qeto\BaseQuery;

class UserQueries extends BaseQuery 
{
    protected $name = 'User';

    public function byType(string $parameter): array
    {
        return ['users.type ' . ($this->inverse ? '!' : '') . '= "?"', [$parameter]];
    }

    /**
     * Gets the created at date between two dates
     * @param  array $dates first key will be start date, second end date
     * @return array
     */
    public function byCreatedDay(array $dates): array
    {
        return ['users.created_at ' . ($this->inverse ? 'NOT ' : '') . 'BETWEEN "?"" AND "?"', [$dates]];
    }


    /**
     * Gets all user by a user type that were made during a certain time period
     * @param  array $parameters string of type, first key will be start date, second end date
     * @return array
     */
    public function getTypesBetweenDate(array $parameters): array
    {
        return $this->joinByAnd([
            'byType',
            'byCreatedDay'
        ], $parameters);
    }
}

然后您将调用 getTypesBetweenDate

$parameters = [
    'pro',
    [
        '2018-05-12',
        '2019-05-13',
    ]
];

User::qWhere('getTypesBetweenDate', $parameters);

这将传递每个参数到特定的函数中,并返回结果。

关联方法

要调用关联方法,只需将关联名称作为查询 qRelationWhere 的第一个参数传递,作为一个Eloquent作用域。

User::qRelationWhere('order', 'byCity', 'Salt Lake City');

这将查询您必须通过 byCity 函数创建的 OrderQueries 模型。

联系我

作者:Dano Gillette

https://twitter.com/danodev

http://danogillette.com