blob: 1b7990eaa100f1650849bcc14c8aa49692a715b2 [file] [log] [blame]
<?php
/**
* File containing the ezcQuerySubSelect class.
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* @package Database
* @version //autogentag//
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
*/
/**
* This class is used to contain subselects
*
* The ezcSubQuery is used for creating correct subqueries inside ezcQuery object.
* The class holds a refenence to the ezcQuery object that this sub-query is
* for, and transfers the bindParam() and bindValue() PDO related calls to it.
*
* Example:
* <code>
* <?php
* $q = ezcDbInstance::get()->createSelectQuery();
*
* // This will produce the following SQL:
* // SELECT * FROM Greetings WHERE age > 10 AND user IN ( ( SELECT lastname FROM users ) )
*
* // Create a subselect:
* $q2 = $q->subSelect();
* $q2->select( 'lastname' )->from( 'users' );
*
* // Use the created subselect to generate the full SQL:
* $q->select( '*' )->from( 'Greetings' );
* ->where( $q->expr->gt( 'age', 10 ),
* $q->expr->in( 'user', $q2 ) );
*
* $stmt = $q->prepare(); // $stmt is a normal PDOStatement
* $stmt->execute();
* ?>
* </code>
*
* @package Database
* @version //autogentag//
*/
class ezcQuerySubSelect extends ezcQuerySelect
{
/**
* Holds the outer query.
*
* @var ezcQuery
*/
protected $outerQuery = null;
/**
* Constructs a new ezcQuerySubSelect object.
*
* The subSelect() method of the ezcQuery object creates an object of this
* class, and passes itself as $outer parameter to this constructor.
*
* @param ezcQuery $outer
*/
public function __construct( ezcQuery $outer )
{
$this->outerQuery = $outer;
if ( $this->expr === null )
{
$this->expr = $outer->db->createExpression();
}
}
/**
* Binds the parameter $param to the specified variable name $placeHolder.
*
* This method uses ezcQuery::bindParam() from the ezcQuery class in which
* the subSelect was called. Info about bound parameters are stored in
* the parent ezcQuery object that is stored in the $outer property.
*
* The parameter $param specifies the variable that you want to bind. If
* $placeholder is not provided bind() will automatically create a
* placeholder for you. An automatic placeholder will be of the name
* 'ezcValue1', 'ezcValue2' etc.
*
* Example:
* <code>
* <?php
* $value = 2;
* $subSelect = $q->subSelect();
* $subSelect->select('*')
* ->from( 'table2' )
* ->where( $subSelect->expr->in(
* 'id', $subSelect->bindParam( $value )
* )
* );
*
* $q->select( '*' )
* ->from( 'table' )
* ->where ( $q->expr->eq( 'id', $subSelect ) );
*
* $stmt = $q->prepare(); // the parameter $value is bound to the query.
* $value = 4;
* $stmt->execute(); // subselect executed with 'id = 4'
* ?>
* </code>
*
* @see ezcQuery::bindParam()
*
* @param &mixed $param
* @param string $placeHolder the name to bind with. The string must start with a colon ':'.
* @return string the placeholder name used.
*/
public function bindParam( &$param, $placeHolder = null, $type = PDO::PARAM_STR )
{
return $this->outerQuery->bindParam( $param, $placeHolder, $type );
}
/**
* Binds the value $value to the specified variable name $placeHolder.
*
* This method uses ezcQuery::bindParam() from the ezcQuery class in which
* the subSelect was called. Info about bound parameters are stored in
* the parent ezcQuery object that is stored in the $outer property.
*
* The parameter $value specifies the value that you want to bind. If
* $placeholder is not provided bindValue() will automatically create a
* placeholder for you. An automatic placeholder will be of the name
* 'ezcValue1', 'ezcValue2' etc.
*
* Example:
* <code>
* <?php
* $value = 2;
* $subSelect = $q->subSelect();
* $subSelect->select( name )
* ->from( 'table2' )
* ->where( $subSelect->expr->in(
* 'id', $subSelect->bindValue( $value )
* )
* );
*
* $q->select( '*' )
* ->from( 'table1' )
* ->where ( $q->expr->eq( 'name', $subSelect ) );
*
* $stmt = $q->prepare(); // the $value is bound to the query.
* $value = 4;
* $stmt->execute(); // subselect executed with 'id = 2'
* ?>
* </code>
*
* @see ezcQuery::bindValue()
*
* @param mixed $value
* @param string $placeHolder the name to bind with. The string must start with a colon ':'.
* @return string the placeholder name used.
*/
public function bindValue( $value, $placeHolder = null, $type = PDO::PARAM_STR )
{
return $this->outerQuery->bindValue( $value, $placeHolder, $type );
}
/**
* Returns the SQL string for the subselect.
*
* Example:
* <code>
* <?php
* $subSelect = $q->subSelect();
* $subSelect->select( name )->from( 'table2' );
* $q->select( '*' )
* ->from( 'table1' )
* ->where ( $q->expr->eq( 'name', $subSelect ) );
* $stmt = $q->prepare();
* $stmt->execute();
* ?>
* </code>
*
* @return string
*/
public function __toString()
{
return $this->getQuery();
}
/**
* Returns the SQL string for the subselect.
*
* Example:
* <code>
* <?php
* $subSelect = $q->subSelect();
* $subSelect->select( name )->from( 'table2' );
* $q->select( '*' )
* ->from( 'table1' )
* ->where ( $q->expr->eq( 'name', $subSelect ) );
* $stmt = $q->prepare();
* $stmt->execute();
* ?>
* </code>
*
* @return string
*/
public function getQuery()
{
return '( ' . parent::getQuery() . ' )';
}
/**
* Returns ezcQuerySubSelect of deeper level.
*
* Used for making subselects inside subselects.
*
* Example:
* <code>
* <?php
* $value = 2;
* $subSelect = $q->subSelect();
* $subSelect->select( name )
* ->from( 'table2' )
* ->where( $subSelect->expr->in(
* 'id', $subSelect->bindValue( $value )
* )
* );
*
* $q->select( '*' )
* ->from( 'table1' )
* ->where ( $q->expr->eq( 'name', $subSelect ) );
*
* $stmt = $q->prepare(); // the $value is bound to the query.
* $value = 4;
* $stmt->execute(); // subselect executed with 'id = 2'
* ?>
* </code>
*
* @return ezcQuerySubSelect
*/
public function subSelect()
{
return new ezcQuerySubSelect( $this->outerQuery );
}
}
?>