CDB.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. <?php
  2. /**
  3. * FecShop file.
  4. *
  5. * @link http://www.fecshop.com/
  6. * @copyright Copyright (c) 2016 FecShop Software LLC
  7. * @license http://www.fecshop.com/license/
  8. */
  9. namespace fec\helpers;
  10. use Yii;
  11. /**
  12. * @author Terry Zhao <2358269014@qq.com>
  13. * @since 1.0
  14. */
  15. class CDB
  16. {
  17. public static $db;
  18. # 1.得到当前的db
  19. public static function getDb($db_name = 'db'){
  20. if(!self::$db){
  21. if(!$db_name){
  22. $db_name = 'db';
  23. }
  24. self::$db = Yii::$app->$db_name;
  25. }
  26. return self::$db;
  27. }
  28. # 1.通过sql查看所有的记录
  29. # example: CDB::findBySql('select * from sales_order_info where order_id > :order_id'
  30. # ,[':order_id'=>1 ]);
  31. public static function findAllBySql($sql,$data=[],$db_name=''){
  32. # example: $sql = 'SELECT * FROM sales_flat_quote';
  33. $db = self::getDb($db_name);
  34. $result = $db->createCommand($sql,$data)
  35. ->queryAll();
  36. return $result;
  37. }
  38. # 2.通过sql查看一条记录
  39. # example: CDB::findOneBySql('select * from sales_order_info where order_id = :order_id'
  40. # ,[':order_id'=>1 ]);
  41. public static function findOneBySql($sql,$data=[],$db_name=''){
  42. # example: $sql ='SELECT * FROM post WHERE id=1'
  43. $db = self::getDb($db_name);
  44. $result = $db->createCommand($sql,$data)
  45. ->queryOne();
  46. return $result;
  47. }
  48. # 3.通过sql插入记录
  49. # $sql = "insert into sales_order_info (increment_id) values (:increment_id) ";
  50. # $data = ['increment_id'=>'eeeeeeeeee'];
  51. # $dd = DB::insertBySql($sql,$data);
  52. public static function insertBySql($sql,$data=[],$db_name=''){
  53. $db = self::getDb($db_name);
  54. $result = $db->createCommand($sql,$data)
  55. ->execute();
  56. return $result;
  57. }
  58. # 4.通过sql更新
  59. # $sql = "update sales_order_info set increment_id = :iid where increment_id = :increment_id";
  60. # $data = ['iid'=>'ddd','increment_id'=>'eeeeeeeeee'];
  61. # $dd = DB::insertBySql($sql,$data);
  62. public static function updateBySql($sql,$data=[],$db_name=''){
  63. $db = self::getDb($db_name);
  64. $result = $db->createCommand($sql,$data)
  65. ->execute();
  66. return $result;
  67. }
  68. # 5.通过sql删除
  69. # $sql = "delete from sales_order_info where increment_id = :increment_id";
  70. # $data = ['increment_id'=>'eeeeeeeeee'];
  71. # $dd = DB::insertBySql($sql,$data);
  72. public static function deleteBySql($sql,$data=[],$db_name=''){
  73. $db = self::getDb($db_name);
  74. $result = $db->createCommand($sql,$data)
  75. ->execute();
  76. return $result;
  77. }
  78. # 6.批量插入数据方式
  79. # $table = 'sales_order_info';
  80. # $columnsArr = ['increment_id','order_status'];
  81. # $valueArr = [
  82. # ['Tom', 30],
  83. # ['Jane', 20],
  84. # ['Linda', 25]
  85. # ];
  86. # DB::batchInsert($table,$columnsArr,$valueArr);
  87. public static function batchInsert($table,$columnsArr,$valueArr,$db_name=''){
  88. $db = self::getDb($db_name);
  89. $db->createCommand()
  90. ->batchInsert($table,$columnsArr,$valueArr)
  91. ->execute();
  92. }
  93. # 一:常见操作-数据表查询
  94. /*
  95. @单一查询,返回是一个对象,可通过数组的形式调用 $customer['quote_id'];
  96. 还可以通过属性的方式 $customer->quote_id;
  97. $customer = Customer::findOne(['customer_id' => (int)$customer_id]);
  98. @全部查询:返回的是对象
  99. $customers = Customer::find()
  100. ->where(['status' => Customer::STATUS_ACTIVE])
  101. ->orderBy('id')
  102. ->all();
  103. @全部查询:返回的是数组 (查询100-109行)
  104. $customers = Customer::find()
  105. ->asArray()
  106. ->where(['status' => Customer::STATUS_ACTIVE])
  107. ->orderBy(['id' => SORT_ASC,'name' => SORT_DESC])
  108. ->limit(10)
  109. ->offset(100)
  110. ->all();
  111. @查询个数:
  112. $count = Customer::find()
  113. ->where(['status' => Customer::STATUS_ACTIVE])
  114. ->count();
  115. @以id为索引的方式查询
  116. $customers = Customer::find()->indexBy('id')->all();
  117. @用原生的sql查询:(只能针对这一个表)
  118. $sql = 'SELECT * FROM customer';
  119. $customers = Customer::findBySql($sql)->all();
  120. @批量获取数据(不常用,针对大数据)
  121. 一次提取 10 个客户信息
  122. foreach (Customer::find()->batch(10) as $customers) {
  123. $customers 是 10 个或更少的客户对象的数组
  124. }
  125. 一次提取 10 个客户并一个一个地遍历处理
  126. foreach (Customer::find()->each(10) as $customer) {
  127. $customer 是一个 ”Customer“ 对象
  128. }
  129. 贪婪加载模式的批处理查询
  130. foreach (Customer::find()->with('orders')->each() as $customer) {
  131. }
  132. */
  133. # 常见操作2:数据表插入
  134. /*
  135. @插入新客户的记录
  136. $customer = new Customer();
  137. $customer->name = 'James';
  138. $customer->email = 'james@example.com';
  139. //等同于 $customer->insert();
  140. $customer->save();
  141. @通过post数组的方式赋值
  142. $model = new Customer;
  143. if ($model->load(Yii::$app->request->post()) && $model->save()) {
  144. }
  145. ####由于AR继承自yii\base\Model,所以它同样也支持Model的数据输入、验证等特性。例如,你可以声明一个rules方法用来覆盖掉yii\base\Model::rules()里的;你也可以给AR实例批量赋值;你也可以通过调用yii\base\Model::validate()执行数据验证。
  146. ####当你调用 save()、insert()、update() 这三个方法时,会自动调用yii\base\Model::validate()方法。如果验证失败,数据将不会保存进数据库。
  147. */
  148. # 常见操作3:数据表更新
  149. /*
  150. @更新现有客户记录
  151. $customer = Customer::findOne(['id' => 1]);
  152. $customer->email = 'james@example.com';
  153. //等同于 $customer->update();
  154. $customer->save();
  155. @所有客户的age(年龄)字段加1:
  156. Customer::updateAllCounters(['age' => 1]);
  157. */
  158. # 常见操作4:数据表数据删除
  159. /*
  160. @删除已有客户记录
  161. $customer = Customer::findOne(['id' => 1]);
  162. $customer->delete();
  163. @删除多个年龄大于20,性别为男(Male)的客户记录
  164. Customer::deleteAll('age > :age AND gender = :gender', [':age' => 20, ':gender' => 'M']);
  165. */
  166. # 常见操作5:读取默认值
  167. /*
  168. 你的表列也许定义了默认值。有时候,你可能需要在使用web表单的时候给AR预设一些值。
  169. 如果你需要这样做,可以在显示表单内容前通过调用
  170. loadDefaultValues()方法来实现:
  171. php $customer = new Customer();
  172. $customer->loadDefaultValues(); // ... 渲染 $customer 的 HTML 表单 ... `
  173. */
  174. /*
  175. 常见操作6:事务操作
  176. # 开始事务
  177. $innerTransaction = Yii::$app->db->beginTransaction();
  178. try {
  179. $innerTransaction->commit();
  180. } catch (Exception $e) {
  181. $innerTransaction->rollBack();
  182. }
  183. */
  184. /*
  185. 各种条件查询。
  186. # where
  187. where('status=1')
  188. where('status=:status', [':status' => $status])
  189. where([
  190. 'status' => 10,
  191. 'type' => null,
  192. 'id' => [4, 8, 15],
  193. ])
  194. -------
  195. $userQuery = (new Query())->select('id')->from('user');
  196. // ...WHERE `id` IN (SELECT `id` FROM `user`)
  197. $query->...->where(['id' => $userQuery])->...
  198. --------
  199. ['and', 'id=1', 'id=2'] //id=1 AND id=2
  200. ['and', 'type=1', ['or', 'id=1', 'id=2']] //type=1 AND (id=1 OR id=2)
  201. ['between', 'id', 1, 10] //id BETWEEN 1 AND 10
  202. ['not between', 'id', 1, 10] //not id BETWEEN 1 AND 10
  203. ['in', 'id', [1, 2, 3]] //id IN (1, 2, 3)
  204. ['not in', 'id', [1, 2, 3]] //not id IN (1, 2, 3)
  205. ['like', 'name', 'tester'] //name LIKE '%tester%'
  206. ['like', 'name', ['test', 'sample']] //name LIKE '%test%' AND name LIKE '%sample%'
  207. ['not like', 'name', ['or', 'test', 'sample']] //not name LIKE '%test%' OR not name LIKE '%sample%'
  208. ['exists','id', $userQuery] //EXISTS (sub-query) | not exists
  209. ['>', 'age', 10] //age>10
  210. 得到刚插入的id
  211. order_id = Yii::$app->db->getLastInsertID();
  212. $sql = 'SELECT * FROM sales_flat_quote';
  213. Yii::$app->db->createCommand($sql,[])
  214. ->queryAll();
  215. */
  216. }