yii2 數據庫查詢結果字段類型的問題

yii2數據庫查詢默認返回的爲AR對象,此時字段類型與數據庫的基本相符,但若是使用 asArray 以數組的方式返回時,默認字段類型全都是 string,若是這樣 json_encode 後返回給 App端的話,會被 Android/IOS這些強類型語言端的工程師們噴死,php會再次被推向風口。php

緣由是 pdoyii2盛行時還不夠完善,一些特性是後期加進來的,好比咱們急切須要的返回的結果數據類型與數據庫一致。mysql

<?php

return [
    'class'       => 'yii\db\Connection',
    'dsn'         => 'mysql:host=localhost;dbname=yii2basic',
    'username'    => 'root',
    'password'    => '123456',
    'charset'     => 'utf8',
    'tablePrefix' => 'yii_',
    'attributes'  => [
        PDO::ATTR_STRINGIFY_FETCHES => false,
        PDO::ATTR_EMULATE_PREPARES  => false,
    ]
    // Schema cache options (for production environment)
    //'enableSchemaCache' => true,
    //'schemaCacheDuration' => 60,
    //'schemaCache' => 'cache',
];

yii2 在數據庫組件配置中添加attributes的兩項配置便可。sql

未配置時:數據庫

// AR 對象的 attributes
array (size=7)
  'id' => string '1' (length=1)
  'account' => string 'big_cat' (length=7)
  'password' => string 'e10adc3949ba59abbe56e057f20f883e' (length=32)
  'age' => int 29
  'created_at' => string '2019-05-16 11:23:26' (length=19)
  'updated_at' => string '2019-05-16 11:23:26' (length=19)
  'status' => int 1

// asArray
array (size=7)
  'id' => string '1' (length=1)
  'account' => string 'big_cat' (length=7)
  'password' => string 'e10adc3949ba59abbe56e057f20f883e' (length=32)
  'age' => string '29' (length=2)
  'created_at' => string '2019-05-16 11:23:26' (length=19)
  'updated_at' => string '2019-05-16 11:23:26' (length=19)
  'status' => string '1' (length=1)

配置後json

// AR 對象的 attributes
array (size=7)
  'id' => string '1' (length=1)
  'account' => string 'big_cat' (length=7)
  'password' => string 'e10adc3949ba59abbe56e057f20f883e' (length=32)
  'age' => int 29
  'created_at' => string '2019-05-16 11:23:26' (length=19)
  'updated_at' => string '2019-05-16 11:23:26' (length=19)
  'status' => int 1

// asArray
array (size=7)
  'id' => int 1
  'account' => string 'big_cat' (length=7)
  'password' => string 'e10adc3949ba59abbe56e057f20f883e' (length=32)
  'age' => int 29
  'created_at' => string '2019-05-16 11:23:26' (length=19)
  'updated_at' => string '2019-05-16 11:23:26' (length=19)
  'status' => int 1

能夠發現:
一、AR 對象默認就能將字段類型與數據庫中儘量的一致,但id仍是string類型。
二、以數組的方式返回結果時,yii2默認將全部字段都以string方式處理,經過配置pdo屬性能徹底的將字段類型同數據庫一致。數組

配置pdo屬性後查詢 AR 對象的話id仍是沒有同數據庫字段類型一致,但數組方式查詢則徹底一致了。yii2

並且數組查詢方式更節省內存,性能更高(yii2其實始終以數組模式查詢,若是不使用asArray模式,會對查詢到的數組結果集結合對應的Model進行映射成相應的AR對象,即asArray實際上是關閉了數組映射至AR對象的步驟,參照),咱們爲App提供數據時自己就是要提供一些數據標量,不必查詢數據對象,因此接口返回數據時都應該以asArray的方式查詢,且配置PDO的屬性以便保持數據字段類型的一致性,避免對接上的混亂。yii

相關文章
相關標籤/搜索