| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 | <?php/** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */namespace yii\db;use yii\base\BaseObject;use yii\helpers\StringHelper;/** * ColumnSchema class describes the metadata of a column in a database table. * * @author Qiang Xue <qiang.xue@gmail.com> * @since 2.0 */class ColumnSchema extends BaseObject{    /**     * @var string name of this column (without quotes).     */    public $name;    /**     * @var bool whether this column can be null.     */    public $allowNull;    /**     * @var string abstract type of this column. Possible abstract types include:     * char, string, text, boolean, smallint, integer, bigint, float, decimal, datetime,     * timestamp, time, date, binary, and money.     */    public $type;    /**     * @var string the PHP type of this column. Possible PHP types include:     * `string`, `boolean`, `integer`, `double`, `array`.     */    public $phpType;    /**     * @var string the DB type of this column. Possible DB types vary according to the type of DBMS.     */    public $dbType;    /**     * @var mixed default value of this column     */    public $defaultValue;    /**     * @var array enumerable values. This is set only if the column is declared to be an enumerable type.     */    public $enumValues;    /**     * @var int display size of the column.     */    public $size;    /**     * @var int precision of the column data, if it is numeric.     */    public $precision;    /**     * @var int scale of the column data, if it is numeric.     */    public $scale;    /**     * @var bool whether this column is a primary key     */    public $isPrimaryKey;    /**     * @var bool whether this column is auto-incremental     */    public $autoIncrement = false;    /**     * @var bool whether this column is unsigned. This is only meaningful     * when [[type]] is `smallint`, `integer` or `bigint`.     */    public $unsigned;    /**     * @var string comment of this column. Not all DBMS support this.     */    public $comment;    /**     * Converts the input value according to [[phpType]] after retrieval from the database.     * If the value is null or an [[Expression]], it will not be converted.     * @param mixed $value input value     * @return mixed converted value     */    public function phpTypecast($value)    {        return $this->typecast($value);    }    /**     * Converts the input value according to [[type]] and [[dbType]] for use in a db query.     * If the value is null or an [[Expression]], it will not be converted.     * @param mixed $value input value     * @return mixed converted value. This may also be an array containing the value as the first element     * and the PDO type as the second element.     */    public function dbTypecast($value)    {        // the default implementation does the same as casting for PHP, but it should be possible        // to override this with annotation of explicit PDO type.        return $this->typecast($value);    }    /**     * Converts the input value according to [[phpType]] after retrieval from the database.     * If the value is null or an [[Expression]], it will not be converted.     * @param mixed $value input value     * @return mixed converted value     * @since 2.0.3     */    protected function typecast($value)    {        if ($value === ''            && !in_array(                $this->type,                [                    Schema::TYPE_TEXT,                    Schema::TYPE_STRING,                    Schema::TYPE_BINARY,                    Schema::TYPE_CHAR                ],                true)        ) {            return null;        }        if ($value === null            || gettype($value) === $this->phpType            || $value instanceof ExpressionInterface            || $value instanceof Query        ) {            return $value;        }        if (is_array($value)            && count($value) === 2            && isset($value[1])            && in_array($value[1], $this->getPdoParamTypes(), true)        ) {            return new PdoValue($value[0], $value[1]);        }        switch ($this->phpType) {            case 'resource':            case 'string':                if (is_resource($value)) {                    return $value;                }                if (is_float($value)) {                    // ensure type cast always has . as decimal separator in all locales                    return StringHelper::floatToString($value);                }                return (string) $value;            case 'integer':                return (int) $value;            case 'boolean':                // treating a 0 bit value as false too                // https://github.com/yiisoft/yii2/issues/9006                return (bool) $value && $value !== "\0";            case 'double':                return (float) $value;        }        return $value;    }    /**     * @return int[] array of numbers that represent possible PDO parameter types     */    private function getPdoParamTypes()    {        return [\PDO::PARAM_BOOL, \PDO::PARAM_INT, \PDO::PARAM_STR, \PDO::PARAM_LOB, \PDO::PARAM_NULL, \PDO::PARAM_STMT];    }}
 |