You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

289 lines
5.4 KiB
PHP

<?php
/**
* The Query Builder.
*
* @since 1.0.0
* @package RankMath
* @subpackage RankMath\Admin\Database
* @author RankMath <support@rankmath.com>
*/
namespace RankMath\Admin\Database;
/**
* Query_Builder class.
*/
class Query_Builder {
use Escape;
use Select;
use Where;
use Joins;
use GroupBy;
use OrderBy;
use Clauses;
use Translate;
/**
* Table name.
*
* @var string
*/
public $table = '';
/**
* Save last query.
*
* @var string
*/
public $last_query = '';
/**
* Make a distinct selection
*
* @var bool
*/
protected $distinct = false;
/**
* Make SQL_CALC_FOUND_ROWS in selection
*
* @var bool
*/
protected $found_rows = false;
/**
* Data store context used to pass to filters.
*
* @var string
*/
protected $context;
/**
* Constructor
*
* @param string $table The table name.
* @param string $context Optional context passed to filters. Default empty string.
*/
public function __construct( $table, $context = '' ) {
$this->table = $table;
$this->context = $context;
$this->reset();
}
/**
* Translate the given query object and return the results
*
* @param string $output (Optional) Any of ARRAY_A | ARRAY_N | OBJECT | OBJECT_K constants.
*
* @return mixed
*/
public function get( $output = \OBJECT ) {
global $wpdb;
$this->last_query = $this->translateSelect();
$this->reset();
return $wpdb->get_results( $this->last_query, $output ); // phpcs:ignore
}
/**
* Translate the given query object and return the results
*
* @param string $output (Optional) Any of ARRAY_A | ARRAY_N | OBJECT | OBJECT_K constants.
*
* @return mixed
*/
public function one( $output = \OBJECT ) {
global $wpdb;
$this->limit( 1 );
$this->last_query = $this->translateSelect();
$this->reset();
return $wpdb->get_row( $this->last_query, $output ); // phpcs:ignore
}
/**
* Translate the given query object and return one variable from the database
*
* @return mixed
*/
public function getVar() { // @codingStandardsIgnoreLine
$row = $this->one( \ARRAY_A );
return is_null( $row ) ? false : current( $row );
}
/**
* Insert a row into a table
*
* @codeCoverageIgnore
* @see wpdb::insert()
*
* @param array $data Data to insert (in column => value pairs). Both $data columns and $data values should be "raw" (neither should be SQL escaped).
* @param array $format (Optional) An array of formats to be mapped to each of the value in $data.
*
* @return mixed
*/
public function insert( $data, $format = null ) {
global $wpdb;
$wpdb->insert( $this->table, $data, $format );
return $wpdb->insert_id;
}
/**
* Update a row into a table
*
* @codeCoverageIgnore
*
* @return mixed
*/
public function update() {
$query = $this->translateUpdate();
$this->reset();
return $this->query( $query );
}
/**
* Delete data from table
*
* @codeCoverageIgnore
*
* @return mixed
*/
public function delete() {
$query = $this->translateDelete();
$this->reset();
return $this->query( $query );
}
/**
* Truncate table.
*
* @codeCoverageIgnore
*
* @return mixed
*/
public function truncate() {
return $this->query( "truncate table {$this->table};" );
}
/**
* Get found rows.
*
* @return int
*/
public function get_found_rows() {
global $wpdb;
return $wpdb->get_var( 'SELECT FOUND_ROWS();' );
}
/**
* Perform a MySQL database query, using current database connection.
*
* @codeCoverageIgnore
*
* @see wpdb::query
*
* @param string $query Database query.
*
* @return int|false Number of rows affected|selected or false on error.
*/
public function query( $query ) {
global $wpdb;
$this->last_query = $query;
return $wpdb->query( $query ); // phpcs:ignore
}
/**
* Set the limit clause.
*
* @param int $limit Limit size.
* @param int $offset Offeset.
*
* @return self The current query builder.
*/
public function limit( $limit, $offset = 0 ) {
global $wpdb;
$limit = \absint( $limit );
$offset = \absint( $offset );
$this->clear_sql_clause( 'limit' );
$this->add_sql_clause( 'limit', $wpdb->prepare( 'LIMIT %d, %d', $offset, $limit ) );
return $this;
}
/**
* Create an query limit based on a page and a page size
*
* @param int $page Page number.
* @param int $size Page size.
*
* @return self The current query builder.
*/
public function page( $page, $size = 25 ) {
$size = \absint( $size );
$offset = $size * \absint( $page );
$this->limit( $size, $offset );
return $this;
}
/**
* Set values for insert/update
*
* @param string|array $name Key of pair.
* @param string|array $value Value of pair.
*
* @return self The current query builder.
*/
public function set( $name, $value = null ) {
if ( is_array( $name ) ) {
$this->sql_clauses['values'] = $this->sql_clauses['values'] + $name;
return $this;
}
$this->sql_clauses['values'][ $name ] = $value;
return $this;
}
/**
* Reset all vaiables.
*
* @return self The current query builder.
*/
private function reset() {
$this->distinct = false;
$this->found_rows = false;
$this->sql_clauses = [
'select' => [],
'from' => [],
'left_join' => [],
'join' => [],
'right_join' => [],
'where' => [],
'where_time' => [],
'group_by' => [],
'having' => [],
'limit' => [],
'order_by' => [],
'values' => [],
];
return $this;
}
}