vendor/doctrine-dbal/lib/Doctrine/DBAL/Query/QueryBuilder.php
author cavaliet
Mon, 07 Jul 2014 17:23:47 +0200
changeset 122 d672f7dd74dc
parent 0 7f95f8617b0b
permissions -rwxr-xr-x
Added tag V00.17 for changeset ada5f3d8b5b4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
/*
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
 * This software consists of voluntary contributions made by many individuals
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
 * and is licensed under the LGPL. For more information, see
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
 * <http://www.doctrine-project.org>.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
namespace Doctrine\DBAL\Query;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
use Doctrine\DBAL\Query\Expression\CompositeExpression,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    Doctrine\DBAL\Connection;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
 * QueryBuilder class is responsible to dynamically create SQL queries.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
 * 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
 * Important: Verify that every feature you use will work with your database vendor.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
 * SQL Query Builder does not attempt to validate the generated SQL at all.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
 * 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
 * The query builder does no validation whatsoever if certain features even work with the
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
 * underlying database vendor. Limit queries and joins are NOT applied to UPDATE and DELETE statements
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
 * even if some vendors such as MySQL support it.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
 * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
 * @link        www.doctrine-project.com
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
 * @since       2.1
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
 * @author      Guilherme Blanco <guilhermeblanco@hotmail.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
 * @author      Benjamin Eberlei <kontakt@beberlei.de>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
class QueryBuilder
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
    /* The query types. */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
    const SELECT = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
    const DELETE = 1;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
    const UPDATE = 2;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
    /** The builder states. */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
    const STATE_DIRTY = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
    const STATE_CLEAN = 1;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
     * @var Doctrine\DBAL\Connection DBAL Connection
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
    private $connection = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
     * @var array The array of SQL parts collected.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
    private $sqlParts = array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
        'select'  => array(),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
        'from'    => array(),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
        'join'    => array(),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
        'set'     => array(),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
        'where'   => null,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
        'groupBy' => array(),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
        'having'  => null,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
        'orderBy' => array()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
    );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
     * @var string The complete SQL string for this query.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
    private $sql;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
     * @var array The query parameters.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
    private $params = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
     * @var array The parameter type map of this query.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
    private $paramTypes = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
     * @var integer The type of query this is. Can be select, update or delete.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
    private $type = self::SELECT;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
     * @var integer The state of the query object. Can be dirty or clean.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
    private $state = self::STATE_CLEAN;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
     * @var integer The index of the first result to retrieve.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
    private $firstResult = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
     * @var integer The maximum number of results to retrieve.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
    private $maxResults = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
    
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
     * The counter of bound parameters used with {@see bindValue)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
     * 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
     * @var int
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
    private $boundCounter = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
     * Initializes a new <tt>QueryBuilder</tt>.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
     * @param Doctrine\DBAL\Connection $connection DBAL Connection
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
    public function __construct(Connection $connection)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
        $this->connection = $connection;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
     * Gets an ExpressionBuilder used for object-oriented construction of query expressions.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
     * This producer method is intended for convenient inline usage. Example:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
     *     $qb = $conn->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
     *         ->select('u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
     *         ->from('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
     *         ->where($qb->expr()->eq('u.id', 1));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
     * For more complex expression construction, consider storing the expression
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
     * builder object in a local variable.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
     * @return Doctrine\DBAL\Query\ExpressionBuilder
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
    public function expr()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
        return $this->connection->getExpressionBuilder();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
     * Get the type of the currently built query.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
     * @return integer
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
    public function getType()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
        return $this->type;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
     * Get the associated DBAL Connection for this query builder.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
     * @return Doctrine\DBAL\Connection
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
    public function getConnection()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
        return $this->connection;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
     * Get the state of this query builder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
     * @return integer Either QueryBuilder::STATE_DIRTY or QueryBuilder::STATE_CLEAN.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
    public function getState()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
        return $this->state;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
    
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
     * Execute this query using the bound parameters and their types.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
     * 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
     * Uses {@see Connection::executeQuery} for select statements and {@see Connection::executeUpdate}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
     * for insert, update and delete statements.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
     * 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
     * @return mixed 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
    public function execute()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
        if ($this->type == self::SELECT) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
            return $this->connection->executeQuery($this->getSQL(), $this->params, $this->paramTypes);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
            return $this->connection->executeUpdate($this->getSQL(), $this->params, $this->paramTypes);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
     * Get the complete SQL string formed by the current specifications of this QueryBuilder.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
     *     $qb = $em->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
     *         ->select('u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
     *         ->from('User', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
     *     echo $qb->getSQL(); // SELECT u FROM User u
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
     * @return string The sql query string.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
    public function getSQL()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
        if ($this->sql !== null && $this->state === self::STATE_CLEAN) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
            return $this->sql;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
        $sql = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
        switch ($this->type) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
            case self::DELETE:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
                $sql = $this->getSQLForDelete();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
                break;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
            case self::UPDATE:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
                $sql = $this->getSQLForUpdate();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
                break;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
            case self::SELECT:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
            default:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
                $sql = $this->getSQLForSelect();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
                break;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
        $this->state = self::STATE_CLEAN;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
        $this->sql = $sql;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
        return $sql;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
     * Sets a query parameter for the query being constructed.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
     *     $qb = $conn->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
     *         ->select('u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
     *         ->from('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
     *         ->where('u.id = :user_id')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
     *         ->setParameter(':user_id', 1);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
     * @param string|integer $key The parameter position or name.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
     * @param mixed $value The parameter value.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
     * @param string|null $type PDO::PARAM_*
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
    public function setParameter($key, $value, $type = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
        if ($type !== null) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
            $this->paramTypes[$key] = $type;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
        $this->params[$key] = $value;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
        return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
     * Sets a collection of query parameters for the query being constructed.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
     *     $qb = $conn->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
     *         ->select('u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
     *         ->from('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
     *         ->where('u.id = :user_id1 OR u.id = :user_id2')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
     *         ->setParameters(array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
     *             ':user_id1' => 1,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
     *             ':user_id2' => 2
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
     *         ));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
     * @param array $params The query parameters to set.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
    public function setParameters(array $params, array $types = array())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
        $this->paramTypes = $types;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
        $this->params = $params;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
        return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
     * Gets all defined query parameters for the query being constructed.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
     * @return array The currently defined query parameters.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
    public function getParameters()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
        return $this->params;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
     * Gets a (previously set) query parameter of the query being constructed.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
     * @param mixed $key The key (index or name) of the bound parameter.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
     * @return mixed The value of the bound parameter.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
    public function getParameter($key)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
        return isset($this->params[$key]) ? $this->params[$key] : null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
     * Sets the position of the first result to retrieve (the "offset").
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
     * @param integer $firstResult The first result to return.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
     * @return Doctrine\DBAL\Query\QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
    public function setFirstResult($firstResult)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
        $this->state = self::STATE_DIRTY;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
        $this->firstResult = $firstResult;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
        return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
     * Gets the position of the first result the query object was set to retrieve (the "offset").
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
     * Returns NULL if {@link setFirstResult} was not applied to this QueryBuilder.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
     * @return integer The position of the first result.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
    public function getFirstResult()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
        return $this->firstResult;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
     * Sets the maximum number of results to retrieve (the "limit").
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
     * @param integer $maxResults The maximum number of results to retrieve.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
     * @return Doctrine\DBAL\Query\QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
    public function setMaxResults($maxResults)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
        $this->state = self::STATE_DIRTY;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
        $this->maxResults = $maxResults;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
        return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
     * Gets the maximum number of results the query object was set to retrieve (the "limit").
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
     * Returns NULL if {@link setMaxResults} was not applied to this query builder.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
     * @return integer Maximum number of results.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
    public function getMaxResults()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
        return $this->maxResults;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
     * Either appends to or replaces a single, generic query part.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
     * The available parts are: 'select', 'from', 'set', 'where',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
     * 'groupBy', 'having' and 'orderBy'.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
     * @param string $sqlPartName
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
     * @param string $sqlPart
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
     * @param string $append
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
     * @return Doctrine\DBAL\Query\QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
    public function add($sqlPartName, $sqlPart, $append = false)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
        $isArray = is_array($sqlPart);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
        $isMultiple = is_array($this->sqlParts[$sqlPartName]);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
        if ($isMultiple && !$isArray) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
            $sqlPart = array($sqlPart);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
        $this->state = self::STATE_DIRTY;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
        if ($append) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
            if ($sqlPartName == "orderBy" || $sqlPartName == "groupBy" || $sqlPartName == "select" || $sqlPartName == "set") {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
                foreach ($sqlPart AS $part) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
                    $this->sqlParts[$sqlPartName][] = $part;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
            } else if ($isArray && is_array($sqlPart[key($sqlPart)])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
                $key = key($sqlPart);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
                $this->sqlParts[$sqlPartName][$key][] = $sqlPart[$key];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
            } else if ($isMultiple) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
                $this->sqlParts[$sqlPartName][] = $sqlPart;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
            } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
                $this->sqlParts[$sqlPartName] = $sqlPart;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
            return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
        $this->sqlParts[$sqlPartName] = $sqlPart;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
        
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
        return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
     * Specifies an item that is to be returned in the query result.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
     * Replaces any previously specified selections, if any.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
     *     $qb = $conn->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
     *         ->select('u.id', 'p.id')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
     *         ->from('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
     *         ->leftJoin('u', 'phonenumbers', 'p', 'u.id = p.user_id');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
     * @param mixed $select The selection expressions.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
    public function select($select = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
        $this->type = self::SELECT;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
        if (empty($select)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
            return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
        $selects = is_array($select) ? $select : func_get_args();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
        return $this->add('select', $selects, false);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
     * Adds an item that is to be returned in the query result.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
     *     $qb = $conn->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
     *         ->select('u.id')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
     *         ->addSelect('p.id')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
     *         ->from('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
     *         ->leftJoin('u', 'phonenumbers', 'u.id = p.user_id');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
     * @param mixed $select The selection expression.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
    public function addSelect($select = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
        $this->type = self::SELECT;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
        if (empty($select)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
            return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
        $selects = is_array($select) ? $select : func_get_args();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
        return $this->add('select', $selects, true);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
     * Turns the query being built into a bulk delete query that ranges over
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
     * a certain table.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
     *     $qb = $conn->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
     *         ->delete('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
     *         ->where('u.id = :user_id');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
     *         ->setParameter(':user_id', 1);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
     * @param string $delete The table whose rows are subject to the deletion.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
     * @param string $alias The table alias used in the constructed query.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
    public function delete($delete = null, $alias = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
        $this->type = self::DELETE;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
        if ( ! $delete) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
            return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
        return $this->add('from', array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
            'table' => $delete,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
            'alias' => $alias
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
        ));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
     * Turns the query being built into a bulk update query that ranges over
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
     * a certain table
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
     *     $qb = $conn->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
     *         ->update('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
     *         ->set('u.password', md5('password'))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
     *         ->where('u.id = ?');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
     * @param string $update The table whose rows are subject to the update.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
     * @param string $alias The table alias used in the constructed query.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
    public function update($update = null, $alias = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
        $this->type = self::UPDATE;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
        if ( ! $update) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
            return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
        return $this->add('from', array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
            'table' => $update,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
            'alias' => $alias
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
        ));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
     * Create and add a query root corresponding to the table identified by the
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
     * given alias, forming a cartesian product with any existing query roots.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
     *     $qb = $conn->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
     *         ->select('u.id')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
     *         ->from('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
     * @param string $from   The table
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
     * @param string $alias  The alias of the table
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
    public function from($from, $alias)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
        return $this->add('from', array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
            'table' => $from,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
            'alias' => $alias
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
        ), true);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
     * Creates and adds a join to the query.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
     *     $qb = $conn->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
     *         ->select('u.name')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
     *         ->from('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
     *         ->join('u', 'phonenumbers', 'p', 'p.is_primary = 1');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
     * @param string $fromAlias The alias that points to a from clause
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
     * @param string $join The table name to join
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
     * @param string $alias The alias of the join table
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
     * @param string $condition The condition for the join
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
    public function join($fromAlias, $join, $alias, $condition = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
        return $this->innerJoin($fromAlias, $join, $alias, $condition);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
     * Creates and adds a join to the query.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
     *     $qb = $conn->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
     *         ->select('u.name')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
     *         ->from('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
     *         ->innerJoin('u', 'phonenumbers', 'p', 'p.is_primary = 1');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
     * @param string $fromAlias The alias that points to a from clause
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
     * @param string $join The table name to join
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
     * @param string $alias The alias of the join table
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
     * @param string $condition The condition for the join
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
    public function innerJoin($fromAlias, $join, $alias, $condition = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
        return $this->add('join', array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
            $fromAlias => array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
                'joinType'      => 'inner',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
                'joinTable'     => $join,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
                'joinAlias'     => $alias,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
                'joinCondition' => $condition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
            )
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
        ), true);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
     * Creates and adds a left join to the query.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
     *     $qb = $conn->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
     *         ->select('u.name')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
     *         ->from('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
     *         ->leftJoin('u', 'phonenumbers', 'p', 'p.is_primary = 1');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
     * @param string $fromAlias The alias that points to a from clause
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
     * @param string $join The table name to join
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
     * @param string $alias The alias of the join table
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
     * @param string $condition The condition for the join
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
    public function leftJoin($fromAlias, $join, $alias, $condition = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
        return $this->add('join', array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
            $fromAlias => array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
                'joinType'      => 'left',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
                'joinTable'     => $join,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
                'joinAlias'     => $alias,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
                'joinCondition' => $condition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
            )
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
        ), true);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
    
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
     * Creates and adds a right join to the query.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
     *     $qb = $conn->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
     *         ->select('u.name')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
     *         ->from('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
     *         ->rightJoin('u', 'phonenumbers', 'p', 'p.is_primary = 1');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
     * @param string $fromAlias The alias that points to a from clause
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
     * @param string $join The table name to join
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
     * @param string $alias The alias of the join table
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
     * @param string $condition The condition for the join
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
    public function rightJoin($fromAlias, $join, $alias, $condition = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
        return $this->add('join', array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
            $fromAlias => array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
                'joinType'      => 'right',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
                'joinTable'     => $join,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
                'joinAlias'     => $alias,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
                'joinCondition' => $condition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
            )
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
        ), true);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
     * Sets a new value for a column in a bulk update query.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   638
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
     *     $qb = $conn->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
     *         ->update('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
     *         ->set('u.password', md5('password'))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
     *         ->where('u.id = ?');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
     * @param string $key The column to set.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
     * @param string $value The value, expression, placeholder, etc.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
    public function set($key, $value)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
        return $this->add('set', $key .' = ' . $value, true);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
     * Specifies one or more restrictions to the query result.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
     * Replaces any previously specified restrictions, if any.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
     *     $qb = $conn->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
     *         ->select('u.name')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
     *         ->from('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
     *         ->where('u.id = ?');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
     *     // You can optionally programatically build and/or expressions
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
     *     $qb = $conn->createQueryBuilder();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
     *     $or = $qb->expr()->orx();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   669
     *     $or->add($qb->expr()->eq('u.id', 1));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
     *     $or->add($qb->expr()->eq('u.id', 2));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
     *     $qb->update('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   673
     *         ->set('u.password', md5('password'))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   674
     *         ->where($or);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   677
     * @param mixed $predicates The restriction predicates.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   678
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   679
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
    public function where($predicates)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
        if ( ! (func_num_args() == 1 && $predicates instanceof CompositeExpression) ) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   683
            $predicates = new CompositeExpression(CompositeExpression::TYPE_AND, func_get_args());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   684
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   685
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
        return $this->add('where', $predicates);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   687
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   688
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   690
     * Adds one or more restrictions to the query results, forming a logical
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
     * conjunction with any previously specified restrictions.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   693
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   694
     *     $qb = $conn->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   695
     *         ->select('u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
     *         ->from('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
     *         ->where('u.username LIKE ?')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   698
     *         ->andWhere('u.is_active = 1');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   699
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   700
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   701
     * @param mixed $where The query restrictions.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   702
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   703
     * @see where()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
    public function andWhere($where)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   706
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
        $where = $this->getQueryPart('where');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
        $args = func_get_args();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   710
        if ($where instanceof CompositeExpression && $where->getType() === CompositeExpression::TYPE_AND) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
            $where->addMultiple($args);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
            array_unshift($args, $where);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
            $where = new CompositeExpression(CompositeExpression::TYPE_AND, $args);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
        return $this->add('where', $where, true);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   719
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   720
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
     * Adds one or more restrictions to the query results, forming a logical
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
     * disjunction with any previously specified restrictions.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   723
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   725
     *     $qb = $em->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
     *         ->select('u.name')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   727
     *         ->from('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
     *         ->where('u.id = 1')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   729
     *         ->orWhere('u.id = 2');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   732
     * @param mixed $where The WHERE statement
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
     * @return QueryBuilder $qb
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   734
     * @see where()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   735
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   736
    public function orWhere($where)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   737
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
        $where = $this->getQueryPart('where');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
        $args = func_get_args();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   741
        if ($where instanceof CompositeExpression && $where->getType() === CompositeExpression::TYPE_OR) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   742
            $where->addMultiple($args);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   743
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
            array_unshift($args, $where);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
            $where = new CompositeExpression(CompositeExpression::TYPE_OR, $args);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   746
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   747
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   748
        return $this->add('where', $where, true);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   749
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   750
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   751
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   752
     * Specifies a grouping over the results of the query.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   753
     * Replaces any previously specified groupings, if any.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   754
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   755
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   756
     *     $qb = $conn->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   757
     *         ->select('u.name')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   758
     *         ->from('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   759
     *         ->groupBy('u.id');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   760
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   761
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   762
     * @param mixed $groupBy The grouping expression.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   763
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   764
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   765
    public function groupBy($groupBy)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   766
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   767
        if (empty($groupBy)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   768
            return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   769
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   770
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   771
        $groupBy = is_array($groupBy) ? $groupBy : func_get_args();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   772
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   773
        return $this->add('groupBy', $groupBy, false);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   775
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   776
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   777
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   778
     * Adds a grouping expression to the query.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   779
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   781
     *     $qb = $conn->createQueryBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   782
     *         ->select('u.name')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   783
     *         ->from('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
     *         ->groupBy('u.lastLogin');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   785
     *         ->addGroupBy('u.createdAt')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   786
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
     * @param mixed $groupBy The grouping expression.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   790
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   791
    public function addGroupBy($groupBy)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   793
        if (empty($groupBy)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   794
            return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   795
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   796
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   797
        $groupBy = is_array($groupBy) ? $groupBy : func_get_args();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   798
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   799
        return $this->add('groupBy', $groupBy, true);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   800
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
     * Specifies a restriction over the groups of the query.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
     * Replaces any previous having restrictions, if any.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   806
     * @param mixed $having The restriction over the groups.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   807
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   808
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   809
    public function having($having)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   810
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   811
        if ( ! (func_num_args() == 1 && $having instanceof CompositeExpression)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   812
            $having = new CompositeExpression(CompositeExpression::TYPE_AND, func_get_args());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   813
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   814
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   815
        return $this->add('having', $having);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   816
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   817
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   818
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   819
     * Adds a restriction over the groups of the query, forming a logical
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   820
     * conjunction with any existing having restrictions.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   821
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   822
     * @param mixed $having The restriction to append.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   823
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   824
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   825
    public function andHaving($having)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   826
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   827
        $having = $this->getQueryPart('having');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   828
        $args = func_get_args();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   829
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   830
        if ($having instanceof CompositeExpression && $having->getType() === CompositeExpression::TYPE_AND) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   831
            $having->addMultiple($args);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   832
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   833
            array_unshift($args, $having);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   834
            $having = new CompositeExpression(CompositeExpression::TYPE_AND, $args);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   835
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   836
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   837
        return $this->add('having', $having);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   838
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   839
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   840
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   841
     * Adds a restriction over the groups of the query, forming a logical
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   842
     * disjunction with any existing having restrictions.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   843
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   844
     * @param mixed $having The restriction to add.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   845
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   846
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   847
    public function orHaving($having)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   848
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   849
        $having = $this->getQueryPart('having');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   850
        $args = func_get_args();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   851
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   852
        if ($having instanceof CompositeExpression && $having->getType() === CompositeExpression::TYPE_OR) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   853
            $having->addMultiple($args);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   854
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   855
            array_unshift($args, $having);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   856
            $having = new CompositeExpression(CompositeExpression::TYPE_OR, $args);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   857
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   858
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   859
        return $this->add('having', $having);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   860
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   861
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   862
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   863
     * Specifies an ordering for the query results.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   864
     * Replaces any previously specified orderings, if any.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   865
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   866
     * @param string $sort The ordering expression.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   867
     * @param string $order The ordering direction.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   868
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   869
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   870
    public function orderBy($sort, $order = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   871
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   872
        return $this->add('orderBy', $sort . ' ' . (! $order ? 'ASC' : $order), false);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   873
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   874
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   875
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   876
     * Adds an ordering to the query results.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   877
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   878
     * @param string $sort The ordering expression.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   879
     * @param string $order The ordering direction.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   880
     * @return QueryBuilder This QueryBuilder instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   881
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   882
    public function addOrderBy($sort, $order = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   883
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   884
        return $this->add('orderBy', $sort . ' ' . (! $order ? 'ASC' : $order), true);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   885
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   886
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   887
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   888
     * Get a query part by its name.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   889
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   890
     * @param string $queryPartName
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   891
     * @return mixed $queryPart
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   892
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   893
    public function getQueryPart($queryPartName)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   894
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   895
        return $this->sqlParts[$queryPartName];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   896
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   897
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   898
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   899
     * Get all query parts.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   900
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   901
     * @return array $sqlParts
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   902
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   903
    public function getQueryParts()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   904
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   905
        return $this->sqlParts;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   906
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   907
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   908
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   909
     * Reset SQL parts
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   910
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   911
     * @param array $queryPartNames
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   912
     * @return QueryBuilder
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   913
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   914
    public function resetQueryParts($queryPartNames = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   915
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   916
        if (is_null($queryPartNames)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   917
            $queryPartNames = array_keys($this->sqlParts);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   918
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   919
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   920
        foreach ($queryPartNames as $queryPartName) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   921
            $this->resetQueryPart($queryPartName);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   922
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   923
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   924
        return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   925
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   926
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   927
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   928
     * Reset single SQL part
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   929
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   930
     * @param string $queryPartName
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   931
     * @return QueryBuilder
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   932
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   933
    public function resetQueryPart($queryPartName)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   934
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   935
        $this->sqlParts[$queryPartName] = is_array($this->sqlParts[$queryPartName])
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   936
            ? array() : null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   937
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   938
        $this->state = self::STATE_DIRTY;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   939
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   940
        return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   941
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   942
    
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   943
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   944
     * Converts this instance into a SELECT string in SQL.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   945
     * 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   946
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   947
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   948
    private function getSQLForSelect()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   949
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   950
        $query = 'SELECT ' . implode(', ', $this->sqlParts['select']) . ' FROM ';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   951
        
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   952
        $fromClauses = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   953
        
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   954
        // Loop through all FROM clauses
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   955
        foreach ($this->sqlParts['from'] as $from) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   956
            $fromClause = $from['table'] . ' ' . $from['alias'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   957
            
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   958
            if (isset($this->sqlParts['join'][$from['alias']])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   959
                foreach ($this->sqlParts['join'][$from['alias']] as $join) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   960
                    $fromClause .= ' ' . strtoupper($join['joinType']) 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   961
                                 . ' JOIN ' . $join['joinTable'] . ' ' . $join['joinAlias'] 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   962
                                 . ' ON ' . ((string) $join['joinCondition']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   963
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   964
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   965
            
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   966
            $fromClauses[] = $fromClause;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   967
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   968
        
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   969
        $query .= implode(', ', $fromClauses) 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   970
                . ($this->sqlParts['where'] !== null ? ' WHERE ' . ((string) $this->sqlParts['where']) : '')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   971
                . ($this->sqlParts['groupBy'] ? ' GROUP BY ' . implode(', ', $this->sqlParts['groupBy']) : '')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   972
                . ($this->sqlParts['having'] !== null ? ' HAVING ' . ((string) $this->sqlParts['having']) : '')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   973
                . ($this->sqlParts['orderBy'] ? ' ORDER BY ' . implode(', ', $this->sqlParts['orderBy']) : '');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   974
        
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   975
        return ($this->maxResults === null && $this->firstResult == null) 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   976
            ? $query
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   977
            : $this->connection->getDatabasePlatform()->modifyLimitQuery($query, $this->maxResults, $this->firstResult);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   978
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   979
    
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   980
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   981
     * Converts this instance into an UPDATE string in SQL.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   982
     * 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   983
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   984
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   985
    private function getSQLForUpdate()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   986
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   987
        $table = $this->sqlParts['from']['table'] . ($this->sqlParts['from']['alias'] ? ' ' . $this->sqlParts['from']['alias'] : '');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   988
        $query = 'UPDATE ' . $table 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   989
               . ' SET ' . implode(", ", $this->sqlParts['set'])
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   990
               . ($this->sqlParts['where'] !== null ? ' WHERE ' . ((string) $this->sqlParts['where']) : '');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   991
        
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   992
        return $query;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   993
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   994
    
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   995
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   996
     * Converts this instance into a DELETE string in SQL.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   997
     * 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   998
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   999
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1000
    private function getSQLForDelete()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1001
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1002
        $table = $this->sqlParts['from']['table'] . ($this->sqlParts['from']['alias'] ? ' ' . $this->sqlParts['from']['alias'] : '');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1003
        $query = 'DELETE FROM ' . $table . ($this->sqlParts['where'] !== null ? ' WHERE ' . ((string) $this->sqlParts['where']) : '');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1004
        
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1005
        return $query;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1006
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1007
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1008
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1009
     * Gets a string representation of this QueryBuilder which corresponds to
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1010
     * the final SQL query being constructed.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1011
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1012
     * @return string The string representation of this QueryBuilder.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1013
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1014
    public function __toString()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1015
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1016
        return $this->getSQL();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1017
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1018
    
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1019
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1020
     * Create a new named parameter and bind the value $value to it.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1021
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1022
     * This method provides a shortcut for PDOStatement::bindValue
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1023
     * when using prepared statements.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1024
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1025
     * The parameter $value specifies the value that you want to bind. If
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1026
     * $placeholder is not provided bindValue() will automatically create a
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1027
     * placeholder for you. An automatic placeholder will be of the name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1028
     * ':dcValue1', ':dcValue2' etc.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1029
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1030
     * For more information see {@link http://php.net/pdostatement-bindparam}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1031
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1032
     * Example:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1033
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1034
     * $value = 2;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1035
     * $q->eq( 'id', $q->bindValue( $value ) );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1036
     * $stmt = $q->executeQuery(); // executed with 'id = 2'
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1037
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1038
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1039
     * @license New BSD License
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1040
     * @link http://www.zetacomponents.org
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1041
     * @param mixed $value
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1042
     * @param mixed $type
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1043
     * @param string $placeHolder the name to bind with. The string must start with a colon ':'.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1044
     * @return string the placeholder name used.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1045
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1046
    public function createNamedParameter( $value, $type = \PDO::PARAM_STR, $placeHolder = null )
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1047
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1048
        if ( $placeHolder === null ) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1049
            $this->boundCounter++;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1050
            $placeHolder = ":dcValue" . $this->boundCounter;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1051
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1052
        $this->setParameter(substr($placeHolder, 1), $value, $type);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1053
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1054
        return $placeHolder;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1055
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1056
    
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1057
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1058
     * Create a new positional parameter and bind the given value to it.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1059
     * 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1060
     * Attention: If you are using positional parameters with the query builder you have
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1061
     * to be very careful to bind all parameters in the order they appear in the SQL
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1062
     * statement , otherwise they get bound in the wrong order which can lead to serious
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1063
     * bugs in your code.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1064
     * 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1065
     * Example:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1066
     * <code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1067
     *  $qb = $conn->createQueryBuilder();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1068
     *  $qb->select('u.*')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1069
     *     ->from('users', 'u')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1070
     *     ->where('u.username = ' . $qb->createPositionalParameter('Foo', PDO::PARAM_STR))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1071
     *     ->orWhere('u.username = ' . $qb->createPositionalParameter('Bar', PDO::PARAM_STR))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1072
     * </code>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1073
     * 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1074
     * @param  mixed $value
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1075
     * @param  mixed $type
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1076
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1077
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1078
    public function createPositionalParameter($value, $type = \PDO::PARAM_STR)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1079
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1080
        $this->boundCounter++;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1081
        $this->setParameter($this->boundCounter, $value, $type);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1082
        return "?";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1083
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1084
}