【问题标题】:Get Raw SQL of Insert Statement获取插入语句的原始 SQL
【发布时间】:2021-11-04 12:22:08
【问题描述】:

我正在寻找一种方法来为 INSERT 语句获取正确的 SQL 查询。我必须导出这些数据以在另一个(非 laravel)系统中使用。 How to get the raw SQL for a Laravel delete/update/insert statement? 的帖子让我成功了,但我的查询仍然是参数化的:

Post::all()->each(function($post)
{
    $builder = DB::table('posts');
    $insertStatement = $builder->getGrammar()->compileInsert($builder->select(['created_at', 'title']), [
                'created_at' => $post->created_at,
                'title' => $post->title
            ]);
    Storage::disk('sql')->append('posts-latest.sql', $insertStatement);
    dump($insertStatement);
}

这会导致...

insert into `posts` (`created_at`, `title`) values (?, ?)

所以我已经设法设置要更新的字段,但是如何将参数换成实际值?

【问题讨论】:

    标签: laravel laravel-query-builder


    【解决方案1】:

    你可以这样做:

    Post::all()->each(function($post){
    
       $builder = DB::table('posts');
       $grammar = $builder->getGrammar();
       $values = [
          'created_at' => $post->created_at,
          'title' => $post->title
       ];
    
       $table = $grammar->wrapTable($builder->from);
    
       if (!is_array(reset($values))) {
           $values = [$values];
       }
    
       $columns = $grammar->columnize(array_keys(reset($values)));
    
       $parameters = collect($values)->map(function ($record) use ($grammar) {
               $record = array_map(function($rec){
                   $rec = str_replace("'", "''", $rec);
                   return "'$rec'";
               },array_values($record));
    
           return '('.implode(', ', $record).')';
       })->implode(', ');
    
       $insertStatement = "insert into $table ($columns) values $parameters";
    
       // $insertStatement should contains everything you need for this post
      
    
    });
    
    

    【讨论】:

    • 谢谢!我最终确实提出了自己的解决方案,并提供了答案。对我的方法的任何反馈表示赞赏!不过你的效果很好。
    • 很好的发现,pretend 显然比我的解决方案更好,也更简单!
    【解决方案2】:

    我最终发现了DB::pretend,它将在不运行查询的情况下生成查询。然后是换人的情况。由于使用了参数,似乎没有办法在不替换的情况下获取原始 SQL。

    Post::all()->each(function($post)
    {
        $builder = DB::table('posts');
    
        $query = DB::pretend(function() use ($builder, $post)
        {
            return $builder->insert([
                'created_at' => $post->created_at,
                'title' => $post->title,
                'content' => $post->content,
                'featured_image_link' => $post->featured_image_link,
                'slug' => $post->slug
            ]);
        });
        
        $bindings = [];
        collect($query[0]['bindings'])->each(function($binding) use (&$bindings)
        {
            $binding = str_replace("'", "\\'", $binding);
            $bindings[] = "'$binding'";
        });
    
        $insertStatement = Str::replaceArray('?', $bindings, $query[0]['query']);
    
        Storage::disk('sql')->append('posts-latest.sql', $insertStatement.';');
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多