时尚档案 / qeto
模型和实体的查询构建器。
Requires
- php: ^7.1
Suggests
- laravel/framework: Makes use of the laravel eloquent scopes.
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
函数将它们合并到一个作用域中。这样,您可以一次性使用合并后的查询。例如,我们持续寻找具有特定用户类型且在特定日期注册成为会员的查询。我们可以创建两个查询 byType
和 byCreatedDay
,并将它们合并成一个我们始终可以一起调用的查询。
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