2017-12-16 7 views
4

私はこの方法でオンになっていないバインドクエリを取得することができます。Laravel - バインドパラメータでクエリを取得するにはどうすればいいですか?

\DB::enableQueryLog(); 
$items = OrderItem::where('name', '=', 'test')->get(); 
$log = \DB::getQueryLog(); 
print_r($log); 

出力は次のとおりです。

(
    [0] => Array 
     (
      [query] => select * from "order_items" where "order_items"."name" = ? and "order_items"."deleted_at" is null 
      [bindings] => Array 
       (
        [0] => test 
       ) 
      [time] => 0.07 
     ) 
) 

しかし、私が本当に必要なことは、このようなバインドクエリです:

select * from "order_items" where "order_items"."name" = 'test' and "order_items"."deleted_at" is null 

私は生のPHPでこれを行うことができますが、laravelコアには何か解決策がありますか?

あなたがしていることを行うことができます

答えて

0

 

    OrderItem::where('name', '=', 'test')->toSql(); 

+0

あなたのコード出力では、バインドクエリーではありません - > select * from "order_items"ここで "order_items"。 "name" =? and "order_items"。 "deleted_at"はnullです。 – fico7489

0

うん、あなたは正しい:/ これは非常に要求された機能である、と私は考えまだ枠組みの理由はその一部ではないがありません...

これが最もエレガントなソリューションではありませんが、あなたはこのような何か行うことができます。

 


    function getPureSql($sql, $binds) { 
     $result = ""; 

     $sql_chunks = explode('?', $sql); 
     foreach ($sql_chunks as $key => $sql_chunk) { 
      if (isset($binds[$key])) { 
       $result .= $sql_chunk . '"' . $binds[$key] . '"'; 
      } 
     } 

     return $result; 
    } 

    $query = OrderItem::where('name', '=', 'test'); 
    $pure_sql_query = getPureSql($query->toSql(), $query->getBindings()); 

    // Or like this: 
    $data = OrderItem::where('name', '=', 'test')->get(); 

    $log = DB::getQueryLog(); 
    $log = end($log); 
    $pure_sql_query = getPureSql($log['query'], $log['bindings']); 
 
1

実は、私は同じのためにhelpers.php内一つの関数を作成しましたが。

$items = OrderItem::where('name', '=', 'test')->get(); 
qldd(); //for dump and die 

またはあなたが

qld(); // for dump only 
を使用することができます:あなたはまた、単にあなたの helpers.phpファイル内でこれらの3つの機能を配置し、次のように同じ使用することができます
if (! function_exists('ql')) 
{ 
    /** 
    * Get Query Log 
    * 
    * @return array of queries 
    */ 
    function ql() 
    { 
     $log = \DB::getQueryLog(); 

     $pdo = \DB::connection()->getPdo(); 

     foreach ($log as &$l) 
     { 
      $bindings = $l['bindings']; 

      if (!empty($bindings)) 
      { 
       foreach ($bindings as $key => $binding) 
       { 
        // This regex matches placeholders only, not the question marks, 
        // nested in quotes, while we iterate through the bindings 
        // and substitute placeholders by suitable values. 
        $regex = is_numeric($key) 
         ? "/\?(?=(?:[^'\\\']*'[^'\\\']*')*[^'\\\']*$)/" 
         : "/:{$key}(?=(?:[^'\\\']*'[^'\\\']*')*[^'\\\']*$)/"; 

        $l['query'] = preg_replace($regex, $pdo->quote($binding), $l['query'], 1); 
       } 
      } 
     } 

     return $log; 
    } 
} 

if (! function_exists('qldd')) 
{ 
    /** 
    * Get Query Log then Dump and Die 
    * 
    * @return array of queries 
    */ 
    function qldd() 
    { 
     dd(ql()); 
    } 
} 

if (! function_exists('qld')) 
{ 
    /** 
    * Get Query Log then Dump 
    * 
    * @return array of queries 
    */ 
    function qld() 
    { 
     dump(ql()); 
    } 
} 

あなたhelpers.phpファイル内

を同じ機能を使用することができます
関連する問題