获取Insert语句的原始SQL

问题描述 投票:0回答:2

我正在寻找一种方法来获取 INSERT 语句的正确 SQL 查询。我必须导出这些数据以便在另一个(非 Laravel)系统中使用。 如何获取 Laravel 删除/更新/插入语句的原始 SQL? 的帖子让我完成了部分任务,但我的查询仍然是参数化的:

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 (?, ?)

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

php laravel laravel-query-builder
2个回答
3
投票

我最终发现

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.';');
});

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
  

});

© www.soinside.com 2019 - 2024. All rights reserved.