nimblest / qeto
模型和实体查询构建器。
Requires
- php: ^8.2
Suggests
- laravel/framework: Makes use of the laravel eloquent scopes.
README
由 DanoDev 构建
##目的 创建查询的单一可管理位置。最初,它们被放入每个表模型中,作为 Laravel scopes 进行 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]];
}
}
此功能允许我们通过用户名搜索用户模型。我们可以传递要使用的 sku,并查询模型。我们已设置了安全绑定。
要调用此函数,我们则调用外观并提供第一个参数为任何所需的函数和第二个参数为查询的参数的 qWhereRaw。
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 scopes 使用
要作为 eloquent scope 使用,只需像调用作用域一样调用该函数,但不要调用原始版本。
User::qWhere('byUsername', 'danodev')->get();
这允许您附加其他作用域并使用其他 eloquent 方法。
##添加子文件夹 将所有查询添加到单个文件会使类变得非常庞大。因此,您可以在文件中添加子类,该文件在父类之后命名空间。例如,假设我们想将用户类型移动到自己的文件,它们是用户类的子类。因此,您会创建一个 App\Queries\User 文件夹并创建一个名为 userTypeQueries.php 的新文件,其中包含同名类并扩展 UserQueries 类。因此,现在假设我们将 byUsername 函数移动到 UserTypeQueries 类。要调用该类,您将文件名作为 camel cased 函数声明的第一部分放在 qWhere 中。
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 模型。
联系我