美文网首页PHP经验分享PHP实战
如何写一个属于自己的数据库封装(8) - CREATE篇(修订版

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

作者: 幼年期程序猿 | 来源:发表于2017-04-07 14:28 被阅读0次

    上一期 如何写一个属于自己的数据库封装(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篇(修订版

        本文链接:https://www.haomeiwen.com/subject/dtjhattx.html