2010-04-08 00:47:42 -03:00
< ? php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* " AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
* LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL ,
* SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT
* LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*
* This software consists of voluntary contributions made by many individuals
2012-05-26 14:37:00 +02:00
* and is licensed under the MIT license . For more information , see
2010-04-08 00:47:42 -03:00
* < http :// www . doctrine - project . org >.
*/
namespace Doctrine\ORM\Tools\Console\Command ;
2017-11-23 11:18:08 +01:00
use Doctrine\Common\Util\Debug ;
2012-10-22 01:58:31 +02:00
use Symfony\Component\Console\Command\Command ;
use Symfony\Component\Console\Input\InputArgument ;
use Symfony\Component\Console\Input\InputInterface ;
2017-11-23 11:18:08 +01:00
use Symfony\Component\Console\Input\InputOption ;
2012-10-22 01:58:31 +02:00
use Symfony\Component\Console\Output\OutputInterface ;
2017-11-23 11:18:21 +01:00
use Symfony\Component\Console\Style\SymfonyStyle ;
2010-04-08 00:47:42 -03:00
/**
* Command to execute DQL queries in a given EntityManager .
*
* @ link www . doctrine - project . org
* @ since 2.0
* @ author Benjamin Eberlei < kontakt @ beberlei . de >
* @ author Guilherme Blanco < guilhermeblanco @ hotmail . com >
* @ author Jonathan Wage < jonwage @ gmail . com >
* @ author Roman Borschel < roman @ code - factory . org >
*/
2012-10-22 01:58:31 +02:00
class RunDqlCommand extends Command
2010-04-08 00:47:42 -03:00
{
2012-12-14 12:49:05 +00:00
/**
* { @ inheritdoc }
*/
2010-04-08 00:47:42 -03:00
protected function configure ()
{
2017-11-23 11:18:08 +01:00
$this -> setName ( 'orm:run-dql' )
-> setDescription ( 'Executes arbitrary DQL directly from the command line' )
-> addArgument ( 'dql' , InputArgument :: REQUIRED , 'The DQL to execute.' )
-> addOption ( 'hydrate' , null , InputOption :: VALUE_REQUIRED , 'Hydration mode of result set. Should be either: object, array, scalar or single-scalar.' , 'object' )
-> addOption ( 'first-result' , null , InputOption :: VALUE_REQUIRED , 'The first result in the result set.' )
-> addOption ( 'max-result' , null , InputOption :: VALUE_REQUIRED , 'The maximum number of results in the result set.' )
-> addOption ( 'depth' , null , InputOption :: VALUE_REQUIRED , 'Dumping depth of Entity graph.' , 7 )
-> addOption ( 'show-sql' , null , InputOption :: VALUE_NONE , 'Dump generated SQL instead of executing query' )
-> setHelp ( 'Executes arbitrary DQL directly from the command line.' );
2010-04-08 00:47:42 -03:00
}
2012-12-14 12:49:05 +00:00
/**
* { @ inheritdoc }
*/
2012-10-22 01:58:31 +02:00
protected function execute ( InputInterface $input , OutputInterface $output )
2010-04-08 00:47:42 -03:00
{
2017-11-23 11:18:21 +01:00
$ui = new SymfonyStyle ( $input , $output );
2015-01-17 21:31:00 +01:00
/* @var $em \Doctrine\ORM\EntityManagerInterface */
2010-04-08 00:47:42 -03:00
$em = $this -> getHelper ( 'em' ) -> getEntityManager ();
if (( $dql = $input -> getArgument ( 'dql' )) === null ) {
2017-11-23 11:18:08 +01:00
throw new \RuntimeException ( " Argument 'dql' is required in order to execute this command correctly. " );
2010-04-08 00:47:42 -03:00
}
$depth = $input -> getOption ( 'depth' );
if ( ! is_numeric ( $depth )) {
2017-11-23 11:18:08 +01:00
throw new \LogicException ( " Option 'depth' must contain an integer value " );
2010-04-08 00:47:42 -03:00
}
$hydrationModeName = $input -> getOption ( 'hydrate' );
$hydrationMode = 'Doctrine\ORM\Query::HYDRATE_' . strtoupper ( str_replace ( '-' , '_' , $hydrationModeName ));
if ( ! defined ( $hydrationMode )) {
throw new \RuntimeException (
" Hydration mode ' $hydrationModeName ' does not exist. It should be either: object. array, scalar or single-scalar. "
);
}
$query = $em -> createQuery ( $dql );
if (( $firstResult = $input -> getOption ( 'first-result' )) !== null ) {
if ( ! is_numeric ( $firstResult )) {
2017-11-23 11:18:08 +01:00
throw new \LogicException ( " Option 'first-result' must contain an integer value " );
2010-04-08 00:47:42 -03:00
}
$query -> setFirstResult (( int ) $firstResult );
}
if (( $maxResult = $input -> getOption ( 'max-result' )) !== null ) {
if ( ! is_numeric ( $maxResult )) {
2017-11-23 11:18:08 +01:00
throw new \LogicException ( " Option 'max-result' must contain an integer value " );
2010-04-08 00:47:42 -03:00
}
2010-09-15 14:29:55 -03:00
$query -> setMaxResults (( int ) $maxResult );
2010-04-08 00:47:42 -03:00
}
2015-01-17 21:31:00 +01:00
if ( $input -> getOption ( 'show-sql' )) {
2017-11-23 11:18:21 +01:00
$ui -> text ( $query -> getSQL ());
2014-12-24 14:15:23 +01:00
return ;
}
2016-12-08 00:31:12 +01:00
$resultSet = $query -> execute ([], constant ( $hydrationMode ));
2010-04-08 00:47:42 -03:00
2017-11-23 11:18:21 +01:00
$ui -> text ( Debug :: dump ( $resultSet , $input -> getOption ( 'depth' ), true , false ));
2010-04-08 00:47:42 -03:00
}
2010-08-23 08:21:41 +02:00
}