上一期 如何写一个属于自己的数据库封装(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篇
网友评论