Doctrine - How to print out the real sql, not just the prepared statement?

后端 未结 19 2469
自闭症患者
自闭症患者 2020-11-30 18:59

We\'re using Doctrine, a PHP ORM. I am creating a query like this:

$q = Doctrine_Query::create()->select(\'id\')->from(\'MyTable\');

19条回答
  •  生来不讨喜
    2020-11-30 19:41

    My solution:

     /**
     * Get SQL from query
     * 
     * @author Yosef Kaminskyi 
     * @param QueryBilderDql $query
     * @return int
     */
    public function getFullSQL($query)
    {
        $sql = $query->getSql();
        $paramsList = $this->getListParamsByDql($query->getDql());
        $paramsArr =$this->getParamsArray($query->getParameters());
        $fullSql='';
        for($i=0;$iformat('Y-m-d H:i:s')."'";
                              break;
                        default:
                            $fullSql.= $paramsArr[$nameParam]->getId();
                    }
    
                }
                else                     
                    $fullSql.= $paramsArr[$nameParam];
    
            }  else {
                $fullSql.=$sql[$i];
            }
        }
        return $fullSql;
    }
    
     /**
     * Get query params list
     * 
     * @author Yosef Kaminskyi 
     * @param  Doctrine\ORM\Query\Parameter $paramObj
     * @return int
     */
    protected function getParamsArray($paramObj)
    {
        $parameters=array();
        foreach ($paramObj as $val){
            /* @var $val Doctrine\ORM\Query\Parameter */
            $parameters[$val->getName()]=$val->getValue();
        }
    
        return $parameters;
    }
     public function getListParamsByDql($dql)
    {
        $parsedDql = preg_split("/:/", $dql);
        $length = count($parsedDql);
        $parmeters = array();
        for($i=1;$i<$length;$i++){
            if(ctype_alpha($parsedDql[$i][0])){
                $param = (preg_split("/[' ' )]/", $parsedDql[$i]));
                $parmeters[] = $param[0];
            }
        }
    
        return $parmeters;}
    

    Example of usage:

    $query = $this->_entityRepository->createQueryBuilder('item');
    $query->leftJoin('item.receptionUser','users');
    $query->where('item.customerid = :customer')->setParameter('customer',$customer)
    ->andWhere('item.paymentmethod = :paymethod')->setParameter('paymethod',"Bonus");
    echo $this->getFullSQL($query->getQuery());
    

提交回复
热议问题