如何写一个属于自己的数据库封装(8) - CREATE篇(修订版)

上一期 如何写一个属于自己的数据库封装(7) - UPDATE篇
上一期 如何写一个属于自己的数据库封装(9) - DELETE篇

本期要点

php的各种 array 函数


Builder.php

    public function create(array $attributes) {
        // 编译insert语法
        $sql = $this->grammar->compileInsert($this, $attributes);
        // 返回自增id/null, false如果失败
        return $this->connector->create($sql, array_flatten($attributes));
    }

Grammar.php

public function compileInsert(Builder $query, array $values) {
    // 带入表名
      $table = $query->from;

      // 判定$values如果不是多维数组(仅一条数据)
      // 将之转成多维数组
    if (!is_array(reset($values)))
      $values = [$values];

    // 将数组的键名用逗号连接起来
      $columns = implode(', ', array_keys(reset($values)));

      // 循环每条数据
      // 用逗号连接与数据值等量的问号, 再用括弧围起 => (?, ?)
      // 最后用逗号连接与所有数据 => (?, ?), (?, ?)
      $parameters = implode(', ', array_map(function ($record) {
      return "(".implode(', ', array_fill(0, sizeof($record), '?')).")";
    }, $values));

      return "insert into $table ($columns) values $parameters";
  }

插入命令支持批量插入数据, 举例如下
仅插入一条数据

[
  'first_name'=>"who am", 'last_name'=> "I"
]

插入多条数据

[
  ['first_name'=>"who am", 'last_name'=> "I"],
  ['first_name'=>"the", 'last_name'=> "next"],
  ...
]

例子

  • 插入一条数据
$a = ['first_name'=>"who am", 'last_name'=> 'I'];

$b = Actor::create($a);

dd($b);

返回结果

string '205' (length=3) // 自增ID
  • 批量插入数据
$a = [
  ['first_name'=>"nothing", 'last_name'=> 'Unless'],
  ['first_name'=>"the", 'last_name'=> 'Next'],
  ['first_name'=>"your", 'last_name'=> 'Dream']
];

$b = Actor::create($a);

dd($b);

返回结果

string '206' (length=3)

批量插入返回首条数据的ID(206), 实际上最后插入的ID应该是208, 这是pdo的锅

完整代码

源代码放在coding.net里, 自己领

上一期 如何写一个属于自己的数据库封装(7) - UPDATE篇
上一期 如何写一个属于自己的数据库封装(9) - DELETE篇

你可能感兴趣的:(如何写一个属于自己的数据库封装(8) - CREATE篇(修订版))