hectororm/query

1.0.0-beta10 2024-07-10 14:51 UTC

README

Latest Version Software license Build Status Quality Grade Total Downloads

Hector 查询是Hector ORM的查询模块。可以独立于ORM使用。

安装

Composer

您可以使用Composer安装Hector 查询,这是推荐的安装方式。

$ composer require hectororm/query

依赖

  • PHP ^8.0
  • 包依赖
    • hectororm/connection

使用方法

查询构建器

您可以使用Connection对象初始化查询构建器。

use Hector\Connection\Connection;
use Hector\Query\QueryBuilder;

$connection = new Connection('...');
$queryBuilder = new QueryBuilder($connection);

$result = $queryBuilder
    ->select('table')
    ->where('field1', 'foo')
    ->where('field2', '>=', 2)
    ->fetchAll();

选择 / 插入 / 更新 / 删除 / 联合

您可以使用特定对象执行选择/插入/更新/删除请求。

  • 选择 : Hector\Query\Select
  • 插入 : Hector\Query\Insert
  • 更新 : Hector\Query\Update
  • 删除 : Hector\Query\Delete
  • 联合 : Hector\Query\Union
use Hector\Query\Select;
use Hector\Query\Insert;
use Hector\Query\Update;
use Hector\Query\Delete;
use Hector\Query\Union;

$select = new Select();
$insert = new Insert();
$update = new Update();
$delete = new Delete();
$union = new Union();

所有这些类都实现了StatementInterface接口。此接口提供了一个获取语句和绑定的方法

StatementInterface::getStatement(BindParamList $bindParams)

使用示例

use Hector\Connection\Connection;
use Hector\Connection\Bind\BindParamList;
use Hector\Query\Select;

$connection = new Connection('...');
$select = new Select();
$select
    ->from('table')
    ->where('field', 'value');

$binds = new BindParamList();
$statement = $select->getStatement($binds);

$result = $connection->fetchAll($statement, $binds);

条件

Hector 查询支持有条件和where条件。方法相同,只需在方法名称中将"where"替换为"having"。

Where / Having

/** @var QueryBuilder $queryBuilder */
use Hector\Query\QueryBuilder;

$queryBuilder
    ->from('table', 'alias')
    ->where('field', '=', 'value')
    ->orWhere('field', '=', 'value2');

快捷方式

  • QueryBuilder::whereIn($column, array $values)
  • QueryBuilder::whereNotIn($column, array $values)
  • QueryBuilder::whereBetween($column, $value1, $value2)
  • QueryBuilder::whereNotBetween($column, $value1, $value2)
  • QueryBuilder::whereGreaterThan($column, $value)
  • QueryBuilder::whereGreaterThanOrEqual($column, $value)
  • QueryBuilder::whereLessThan($column, $value)
  • QueryBuilder::whereLessThanOrEqual($column, $value)
  • QueryBuilder::whereExists($statement)
  • QueryBuilder::whereNotExists($statement)
  • QueryBuilder::whereContains($string)
  • QueryBuilder::whereStartsWith($string)
  • QueryBuilder::whereEndsWith($string)

您可以使用方法指定列名和别名

QueryBuilder::column($column, $alias)

重复调用此方法,向结果行添加新列;您可以使用方法QueryBuilder::resetColumns()重置列。

或传递列名数组

QueryBuilder::columns(array $columnNames)

分组

您可以使用方法对结果进行分组

QueryBuilder::groupBy($column)

重复调用此方法,添加新分组;您可以使用方法QueryBuilder::resetGroups()重置分组。

如果您想为语句设置WITH ROLLUP修改符,可以使用方法

QueryBuilder::groupByWithRollup(bool $withRollup = true)

排序

您可以使用方法对结果进行排序

QueryBuilder::orderBy($column, $order)

重复调用此方法,添加新排序;您可以使用方法QueryBuilder::resetOrder()重置排序。

如果想要随机排序,有一个快捷方式可用

QueryBuilder::random()

限制

您可以使用方法限制结果

  • QueryBuilder::limit(int $limit, int $offset = null)
  • QueryBuilder::offset(int $offset)

如果您想重置限制,使用方法QueryBuilder::resetLimit()

赋值

对于插入/更新语句,您需要使用方法分配值

QueryBuilder::assign($column, $value)

重复调用此方法,向语句添加新赋值;您可以使用方法QueryBuilder::resetAssignments()重置赋值。

或传递包含列名和值的关联数组

QueryBuilder::assigns(array|StatementInterface $columnValues)

连接

有三种方法可用于执行连接

  • QueryBuilder::innerJoin($table, $condition, ?string $alias = null)
  • QueryBuilder::leftJoin($table, $condition, ?string $alias = null)
  • QueryBuilder::rightJoin($table, $condition, ?string $alias = null)

如果您想重置连接,请使用方法 QueryBuilder::resetJoin()

联合

提供了一个 Union 类,用于与选择进行联合。

use Hector\Connection\Connection;
use Hector\Query\Select;
use Hector\Query\Union;

$connection = new Connection('...');
$union = new Union();

/** @var Select $select1 */
/** @var Select $select2 */
$union->addSelect($select1, $select2);

Union 类是 StatementInterface,因此请参考相关段落以了解如何使用它。

获取结果

有 3 种方法可以获取结果

  • QueryBuilder::fetchOne(): ?array 获取语句结果的第一行。
  • QueryBuilder::fetchAll(): Generator 获取语句结果的所有行,使用 Generator 类。
  • QueryBuilder::fetchColumn(int $column = 0): Generator 获取语句结果所有行的指定列值,使用 Generator 类。

要了解如何使用 Generator,请参考 PHP 文档:[https://php.ac.cn/manual/class.generator.php](https://php.ac.cn/manual/class.generator.php)

计数结果

QueryBuilder 类中提供了一个快捷方法来计数结果。

/** @var QueryBuilder $queryBuilder */
use Hector\Query\QueryBuilder;

$queryBuilder
    ->from('table', 'alias')
    ->where('field', '=', 'value')
    ->orWhere('field', '=', 'value2');

$count = $queryBuilder->count();
$results = $queryBuilder->fetchAll();

此方法会重置查询的列、限制和排序;但不会修改查询构建器,因此您可以使用它继续获取结果,例如。

存在

QueryBuilder 类中提供了一个快捷方法来执行存在查询。

/** @var QueryBuilder $queryBuilder */
use Hector\Query\QueryBuilder;

$queryBuilder
    ->from('table', 'alias')
    ->where('field', '=', 'value')
    ->orWhere('field', '=', 'value2');

$exists = $queryBuilder->exists();

此方法不会修改查询构建器,因此您可以使用它继续获取结果,例如。

插入 / 更新 / 删除

QueryBuilder 类中提供了快捷方法来执行插入、更新或删除操作。

/** @var QueryBuilder $queryBuilder */
use Hector\Query\QueryBuilder;
use Hector\Query\Select;

$queryBuilder
    ->from('table', 'alias')
    ->where('field', '=', 'value')
    ->orWhere('field', '=', 'value2');

$affectedRows = $queryBuilder->insert(['field' => 'value', 'field2' => 'value2']);
$affectedRows = $queryBuilder->insert((new Select())->from('table_src'));
$affectedRows = $queryBuilder->update(['field' => 'value']);
$affectedRows = $queryBuilder->delete();

这些方法不会修改查询构建器,因此您可以使用它继续获取结果,例如。