* 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();
* ?>
*
*
* @package Database
* @version 1.4.7
*/
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:
*
* 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'
* ?>
*
*
* @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:
*
* 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'
* ?>
*
*
* @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:
*
* subSelect();
* $subSelect->select( name )->from( 'table2' );
* $q->select( '*' )
* ->from( 'table1' )
* ->where ( $q->expr->eq( 'name', $subSelect ) );
* $stmt = $q->prepare();
* $stmt->execute();
* ?>
*
*
* @return string
*/
public function __toString()
{
return $this->getQuery();
}
/**
* Returns the SQL string for the subselect.
*
* Example:
*
* subSelect();
* $subSelect->select( name )->from( 'table2' );
* $q->select( '*' )
* ->from( 'table1' )
* ->where ( $q->expr->eq( 'name', $subSelect ) );
* $stmt = $q->prepare();
* $stmt->execute();
* ?>
*
*
* @return string
*/
public function getQuery()
{
return '( ' . parent::getQuery() . ' )';
}
/**
* Returns ezcQuerySubSelect of deeper level.
*
* Used for making subselects inside subselects.
*
* Example:
*
* 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'
* ?>
*
*
* @return ezcQuerySubSelect
*/
public function subSelect()
{
return new ezcQuerySubSelect( $this->outerQuery );
}
}
?>