Laravel how to get query with bindings?

前端 未结 14 736
小蘑菇
小蘑菇 2021-01-31 15:58

I have some query that I need to pass to another query using query builder

$query = DB::table(\'table\')->whereIn(\'some_field\', [1,2,30])->toSql();

Mode         


        
14条回答
  •  佛祖请我去吃肉
    2021-01-31 16:43

    I created this function. It is partial, might be parameters which are not covered, for me it was enough.
    More than welcomed to add your improvements in a comment!

    function getFullSql($query) {
      $sqlStr = $query->toSql();
      foreach ($query->getBindings() as $iter=>$binding) {
    
        $type = gettype($binding);
        switch ($type) {
          case "integer":
          case "double":
            $bindingStr = "$binding";
            break;
          case "string":
            $bindingStr = "'$binding'";
            break;
          case "object":
            $class = get_class($binding);
            switch ($class) {
              case "DateTime":
                $bindingStr = "'" . $binding->format('Y-m-d H:i:s') . "'";
                break;
              default:
                throw new \Exception("Unexpected binding argument class ($class)");
            }
            break;
          default:
            throw new \Exception("Unexpected binding argument type ($type)");
        }
    
        $currentPos = strpos($sqlStr, '?');
        if ($currentPos === false) {
          throw new \Exception("Cannot find binding location in Sql String for bundung parameter $binding ($iter)");
        }
    
        $sqlStr = substr($sqlStr, 0, $currentPos) . $bindingStr . substr($sqlStr, $currentPos + 1);
      }
    
      $search = ["select", "distinct", "from", "where", "and", "order by", "asc", "desc", "inner join", "join"];
      $replace = ["SELECT", "DISTINCT", "\n  FROM", "\n    WHERE", "\n    AND", "\n    ORDER BY", "ASC", "DESC", "\n  INNER JOIN", "\n  JOIN"];
      $sqlStr = str_replace($search, $replace, $sqlStr);
    
      return $sqlStr;
    }
    

提交回复
热议问题