[李景山php]每天TP5-20170111|thinkphp5-Model.php-4

/**
 * 设置需要追加的输出属性
 * @access public
 * @param array $append 属性列表
 * @return $this
 */
public function append($append = [])
{
    $this->append = $append;// 属性追加
    return $this;
}

/**
 * 设置需要隐藏的输出属性
 * @access public
 * @param array $hidden 属性列表
 * @return $this
 */
public function hidden($hidden = [])
{
    $this->hidden = $hidden;// 属性隐藏
    return $this;
}

/**
 * 设置需要输出的属性
 * @param array $visible
 * @return $this
 */
public function visible($visible = [])
{
    $this->visible = $visible;// 输出的属性
    return $this;
}

/**
 * 转换当前模型对象为数组
 * @access public
 * @return array
 */
public function toArray()
{
    $item = [];

    //过滤属性
    if (!empty($this->visible)) {
        $data = array_intersect_key($this->data, array_flip($this->visible));
    } elseif (!empty($this->hidden)) {
        $data = array_diff_key($this->data, array_flip($this->hidden));
    } else {
        $data = $this->data;
    }

    foreach ($data as $key => $val) {
        if ($val instanceof Model || $val instanceof Collection) {
            // 关联模型对象
            $item[$key] = $val->toArray();
        } elseif (is_array($val) && reset($val) instanceof Model) {
            // 关联模型数据集
            $arr = [];
            foreach ($val as $k => $value) {
                $arr[$k] = $value->toArray();
            }
            $item[$key] = $arr;
        } else {
            // 模型属性
            $item[$key] = $this->getAttr($key);
        }
    }
    // 追加属性(必须定义获取器)
    if (!empty($this->append)) {
        foreach ($this->append as $name) {
            $item[$name] = $this->getAttr($name);
        }
    }
    return !empty($item) ? $item : [];
}// 转换为数组

/**
 * 转换当前模型对象为JSON字符串
 * @access public
 * @param integer   $options json参数
 * @return string
 */
public function toJson($options = JSON_UNESCAPED_UNICODE)
{
    return json_encode($this->toArray(), $options);// 转换wield json
}

/**
 * 获取模型对象的主键
 * @access public
 * @param string $name 模型名
 * @return mixed
 */
public function getPk($name = ‘‘)
{// 获取主键
    if (!empty($name)) {
        $table = $this->db()->getTable($name);
        return $this->db()->getPk($table);
    } elseif (empty($this->pk)) {
        $this->pk = $this->db()->getPk();
    }
    return $this->pk;
}

/**
 * 判断一个字段名是否为主键字段
 * @access public
 * @param string $key 名称
 * @return bool
 */
protected function isPk($key)
{// 检测是否为主键
    $pk = $this->getPk();
    if (is_string($pk) && $pk == $key) {
        return true;
    } elseif (is_array($pk) && in_array($key, $pk)) {
        return true;
    }
    return false;
}

/**
 * 保存当前数据对象
 * @access public
 * @param array     $data 数据
 * @param array     $where 更新条件
 * @param string    $sequence     自增序列名
 * @return integer|false
 */
public function save($data = [], $where = [], $sequence = null)
{// 数据保存
    if (!empty($data)) {// 数据不为空
        // 数据自动验证
        if (!$this->validateData($data)) {
            return false;
        }
        // 数据对象赋值
        foreach ($data as $key => $value) {// 数据对象赋值
            $this->setAttr($key, $value, $data);
        }
        if (!empty($where)) {// 条件不为空 代表为 更新状态
            $this->isUpdate = true;
        }
    }

    // 检测字段
    if (!empty($this->field)) {// 字段不为空
        $this->db();
        foreach ($this->data as $key => $val) {// 删除数据里面的 多有的字段信息
            if (!in_array($key, $this->field)) {
                unset($this->data[$key]);
            }
        }
    }

    // 数据自动完成
    $this->autoCompleteData($this->auto);// 数据自动完成

    // 自动写入更新时间
    if ($this->autoWriteTimestamp && $this->updateTime) {// 时间属性设置
        $this->setAttr($this->updateTime, null);
    }

    // 事件回调
    if (false === $this->trigger(‘before_write‘, $this)) {// 回调
        return false;
    }

    if ($this->isUpdate) {// 执行更新
        // 自动更新
        $this->autoCompleteData($this->update);

        // 事件回调
        if (false === $this->trigger(‘before_update‘, $this)) {
            return false;
        }

        // 去除没有更新的字段
        $data = [];
        foreach ($this->data as $key => $val) {
            if (in_array($key, $this->change) || $this->isPk($key)) {
                $data[$key] = $val;
            }
        }

        if (!empty($this->readonly)) {
            // 只读字段不允许更新
            foreach ($this->readonly as $key => $field) {
                if (isset($data[$field])) {
                    unset($data[$field]);
                }
            }
        }

        if (empty($where) && !empty($this->updateWhere)) {
            $where = $this->updateWhere;
        }

        if (!empty($where)) {
            $pk = $this->getPk();
            if (is_string($pk) && isset($data[$pk])) {
                unset($data[$pk]);
            }
        }

        $result = $this->db()->where($where)->update($data);// 还是使用数据库 模型的更新
        // 清空change
        $this->change = [];
        // 更新回调
        $this->trigger(‘after_update‘, $this);
    } else {
        // 自动写入
        $this->autoCompleteData($this->insert);

        // 自动写入创建时间
        if ($this->autoWriteTimestamp && $this->createTime) {
            $this->setAttr($this->createTime, null);
        }

        if (false === $this->trigger(‘before_insert‘, $this)) {
            return false;
        }

        $result = $this->db()->insert($this->data);// 数据模型的插入

        // 获取自动增长主键
        if ($result) {
            $insertId = $this->db()->getLastInsID($sequence);// 获取自动增长的主键
            $pk       = $this->getPk();
            if (is_string($pk) && $insertId) {
                $this->data[$pk] = $insertId;
            }
        }
        // 标记为更新
        $this->isUpdate = true;
        // 清空change
        $this->change = [];
        // 新增回调
        $this->trigger(‘after_insert‘, $this);
    }
    // 写入回调
    $this->trigger(‘after_write‘, $this);

    return $result;
}

/**
 * 保存多个数据到当前数据对象
 * @access public
 * @param array     $dataSet 数据
 * @param boolean   $replace 是否自动识别更新和写入
 * @return array|false
 */
public function saveAll($dataSet, $replace = true)// 基于事务的 批量插入及更新
{
    if ($this->validate) {//批量数据验证
        // 数据批量验证
        $validate = $this->validate;
        foreach ($dataSet as $data) {
            if (!$this->validate($validate)->validateData($data)) {
                return false;
            }
        }
    }

    $result = [];
    $db     = $this->db();
    $db->startTrans();// 启动事务
    try {
        $pk = $this->getPk();
        if (is_string($pk) && $replace) {
            $auto = true;
        }
        foreach ($dataSet as $key => $data) {
            if (!empty($auto) && isset($data[$pk])) {
                $result[$key] = self::update($data);
            } else {
                $result[$key] = self::create($data);
            }
        }
        $db->commit();// 提交事务
        return $result;
    } catch (\Exception $e) {
        $db->rollback();// 否则回滚
        throw $e;
    }
}
时间: 2024-10-17 08:26:42

[李景山php]每天TP5-20170111|thinkphp5-Model.php-4的相关文章

[李景山php]每天laravel-20161010|Validator.php-10

   /**     * Validate the guessed extension of a file upload is in a set of file extensions.     *     * @param  string  $attribute     * @param  mixed  $value     * @param  array   $parameters     * @return bool     */    protected function validate

[李景山php]每天TP5-20161207|Loader.php-5

/**  * 实例化(分层)模型  * @param string $name         Model名称  * @param string $layer        业务层名称  * @param bool   $appendSuffix 是否添加类名后缀  * @param string $common       公共模块名  * @return Object  * @throws ClassNotFoundException  */ public static function m

[李景山php]每天TP5-20170115|thinkphp5-Model.php-8

    /**      * 预载入关联查询 返回模型对象      * @access public      * @param Model     $result 数据对象      * @param string    $relation 关联名      * @return Model      */     public function eagerlyResult($result, $relation)     {         return $this->relation()->

[李景山php]每天TP5-20170110|thinkphp5-Model.php-3

/**  * 自动写入时间戳  * @access public  * @param string         $name 时间戳字段  * @return mixed  */ protected function autoWriteTimestamp($name) {// 自动写入 时间戳     if (isset($this->type[$name])) {// 如果当期时间戳字段 拥有 类型         $type = $this->type[$name];// 获取当前字段 

[李景山php]每天TP5-20170108|thinkphp5-Model.php-1

<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006~2016 http://thinkphp.cn All 

[李景山php]每天TP5-20161217|thinkphp5-helper.php-2

<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006~2016 http://thinkphp.cn All 

[李景山php]每天TP5-20161224|thinkphp5-Console.php-1

namespace think; use think\console\Command;// 控制台 命令 use think\console\command\Help as HelpCommand; // 帮助命令 use think\console\Input;// 输入 use think\console\input\Argument as InputArgument;// 输入参数 use think\console\input\Definition as InputDefinition;

[李景山php]每天TP5-20161221|thinkphp5-jump.php

<?php /**  * 用法:  * load_trait('controller/Jump');  * class index  * {  *     use \traits\controller\Jump;  *     public function index(){  *         $this->error();  *         $this->redirect();  *     }  * }  */ namespace traits\controller; use

[李景山php]thinkphp核心源码注释|Driver.class.php

<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK IT ] // +---------------------------------------------------------------------- // | Copyright (c) 2006-2014 http://thinkphp.cn A

[李景山php]thinkphp核心源码注释|Lite.class.php

<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK IT ] // +---------------------------------------------------------------------- // | Copyright (c) 2006-2014 http://thinkphp.cn A