<commit_before><?php

namespace Ice\DB;

class BaseModel extends \Ice_DB_Query {

    protected $pk = 'id'; //主键
    protected $autoAddTimeField = 'add_time'; //需要在添加记录时自动处理为当前时间的字段，没有或不需要可定义为空
    protected $autoUpdteTimeField = 'update_time'; //需要在更新记录时自动处理为当前时间的字段，没有或不需要可定义为空
    protected $tableName = '';
    protected $dbResource = '';
    protected $mapping = [];

    /**
     * 根据运行时赋值字段处理字段
     * @param array $data 要处理的数据
     * @param enum $runtime add|update
     */
    protected function assignAutoField(&$data, $runtime) {
        $autoAssignMap = [
            'add'    => [$this->autoAddTimeField, $this->autoUpdteTimeField],
            'update' => [$this->autoUpdteTimeField],
        ];

        if ($data && is_array($data) && isset($autoAssignMap[$runtime])) {
            if (isset($data[0]) && count($data[0]) >= 2) {
                //已拼为setValues的data
                $keys = array_column($data, 0);
                foreach ($autoAssignMap[$runtime] as $field) {
                    if ($field && isset($this->mapping[$field]) && !in_array($field, $keys)) {
                        $data[] = [$field, time()];
                    }
                }
            } else {
                //键值对data
                foreach ($autoAssignMap[$runtime] as $field) {
                    if ($field && isset($this->mapping[$field]) && !isset($data[$field])) {
                        $data[$field] = time();
                    }
                }
            }
        }
    }

    /**
     * 添加数据
     * @param array $data
     * @return 失败 FALSE
     */
    public function add($data) {
        $returnValue = false;

        if ($data && is_array($data)) {
            $this->assignAutoField($data, 'add');
            $insertData = [];
            foreach ($data as $k => $v) {
                if (isset($this->mapping[$k])) {
                    $insertData[$k] = $v;
                }
            }
            if ($insertData) {
                $returnValue = $this->insert($insertData);
            }
        }
        return $returnValue;
    }

    /**
     * 根据一个关联数组条件获取单条数据（将关联数组拼为 k1=v1 AND k2=v2 格式条件）
     * @param array $data 条件
     */
    public function getInfoByAssoc($data, $cols = '*') {
        $returnData = false;

        if ($data && is_array($data)) {
            $where = [];
            foreach ($data as $k => $v) {
                if (isset($this->mapping[$k])) {
                    $where[] = [$k, $v];
                }
            }
            if ($where) {
                $returnData = $this->getRow($where, $cols);
            }
        }

        return $returnData;
    }

    /**
     * 根据主键获取单条信息
     * @param str $pk 主键值
     */
    public function getInfoByPk($pk) {
        return $this->getInfoByAssoc([$this->pk => $pk]);
    }

    /**
     * 根据多个主键批量获取信息列表
     * @param array $pks 主键列表
     */
    public function getListByPks($pks) {
        $returnData = [];

        if ($pks && is_array($pks)) {
            $where = [
                [':in', $this->pk, $pks],
            ];
            if ($where) {
                $returnData = $this->getRows($where);
            }
        }

        return $returnData;
    }

    /**
     * 根据一个关联数组条件获取列表数据（将关联数组拼为 k1=v1 AND k2=v2 格式条件）
     * @param array $data 条件
     */
    public function getListByAssoc($data, $limit = FALSE, $offset = 0, $orderBy = FALSE, $cols = '*') {
        $returnData = [];
<commit_msg>为basemodel类的getListByAssoc方法添加cols参数,支持数据库中select XXX 的可配<commit_after><?php

namespace Ice\DB;

class BaseModel extends \Ice_DB_Query {

    protected $pk = 'id'; //主键
    protected $autoAddTimeField = 'add_time'; //需要在添加记录时自动处理为当前时间的字段，没有或不需要可定义为空
    protected $autoUpdteTimeField = 'update_time'; //需要在更新记录时自动处理为当前时间的字段，没有或不需要可定义为空
    protected $tableName = '';
    protected $dbResource = '';
    protected $mapping = [];

    /**
     * 根据运行时赋值字段处理字段
     * @param array $data 要处理的数据
     * @param enum $runtime add|update
     */
    protected function assignAutoField(&$data, $runtime) {
        $autoAssignMap = [
            'add'    => [$this->autoAddTimeField, $this->autoUpdteTimeField],
            'update' => [$this->autoUpdteTimeField],
        ];

        if ($data && is_array($data) && isset($autoAssignMap[$runtime])) {
            if (isset($data[0]) && count($data[0]) >= 2) {
                //已拼为setValues的data
                $keys = array_column($data, 0);
                foreach ($autoAssignMap[$runtime] as $field) {
                    if ($field && isset($this->mapping[$field]) && !in_array($field, $keys)) {
                        $data[] = [$field, time()];
                    }
                }
            } else {
                //键值对data
                foreach ($autoAssignMap[$runtime] as $field) {
                    if ($field && isset($this->mapping[$field]) && !isset($data[$field])) {
                        $data[$field] = time();
                    }
                }
            }
        }
    }

    /**
     * 添加数据
     * @param array $data
     * @return 失败 FALSE
     */
    public function add($data) {
        $returnValue = false;

        if ($data && is_array($data)) {
            $this->assignAutoField($data, 'add');
            $insertData = [];
            foreach ($data as $k => $v) {
                if (isset($this->mapping[$k])) {
                    $insertData[$k] = $v;
                }
            }
            if ($insertData) {
                $returnValue = $this->insert($insertData);
            }
        }
        return $returnValue;
    }

    /**
     * 根据一个关联数组条件获取单条数据（将关联数组拼为 k1=v1 AND k2=v2 格式条件）
     * @param array $data 条件
     */
    public function getInfoByAssoc($data, $cols = '*') {
        $returnData = false;

        if ($data && is_array($data)) {
            $where = [];
            foreach ($data as $k => $v) {
                if (isset($this->mapping[$k])) {
                    $where[] = [$k, $v];
                }
            }
            if ($where) {
                $returnData = $this->getRow($where, $cols);
            }
        }

        return $returnData;
    }

    /**
     * 根据主键获取单条信息
     * @param str $pk 主键值
     */
    public function getInfoByPk($pk) {
        return $this->getInfoByAssoc([$this->pk => $pk]);
    }

    /**
     * 根据多个主键批量获取信息列表
     * @param array $pks 主键列表
     */
    public function getListByPks($pks) {
        $returnData = [];

        if ($pks && is_array($pks)) {
            $where = [
                [':in', $this->pk, $pks],
            ];
            if ($where) {
                $returnData = $this->getRows($where);
            }
        }

        return $returnData;
    }

    /**
     * 根据一个关联数组条件获取列表数据（将关联数组拼为 k1=v1 AND k2=v2 格式条件）
     * @param array $data 条件
     */
    public function getListByAssoc($data, $cols = '*', $limit = FALSE, $offset = 0, $orderBy = FALSE) {
        $returnData = [];

{'fraction_non_alphanumeric': 0.15510263081815553, 'fraction_numerical': 0.0037583116507661175, 'mean_word_length': 1.5224207072548306, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 43, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7350998', 'n_tokens_mistral': 2379, 'n_tokens_neox': 2380, 'n_words': 406}