前端

一、简介: React 是一个用于构建用户界面的 JAVASCRIPT 库。 React主要用于构建UI,很多人认为 React 是 MVC 中的 V(视图)。 React 起源于 Facebook 的内部项目,用来架设 Instagram 的网站,并于 2013 年 5 月开源。 React 拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它。 1.1、React 特点 1.声明式设计 −React采用声明范式,可以轻松描述应用。 2.高效 −React通过对DOM的模拟,最大限度地减少与DOM的交互。 3.灵活 −React可以与已知的库或框架很好地配合。 4.JSX − JSX 是 JavaScript 语法的扩展。React 开发不一定使用 JSX ,但我们建议使用它。 5.组件 − 通过 React 构建组件,使得代码更加容易得到复用,能够很好的应用在大项目的开发中。 6.单向响应的数据流 − React 实现了单向响应的数据流,从而减少了重复代码,这也是它为什么比传统数据绑定更简单。 1.2、为什么使用 React? React 是一个 Facebook 和 Instagram 用来创建用户界面的 JavaScript 库。很人多认为 React 是 MVC 中的 V(视图)。 我们创造 React 是为了解决一个问题:构建随着时间数据不断变化的大规模应用程序。为了达到这个目标,React 采用下面两个主要的思想。 简单 仅仅只要表达出你的应用程序在任一个时间点应该长的样子,然后当底层的数据变了,React 会自动处理所有用户界面的更新。 声明式 (Declarative) 数据变化后,React 概念上与点击“刷新”按钮类似,但仅会更新变化的部分。 构建可组合的组件 React 都是关于构建可复用的组件。事实上,通过 React 你唯一要做的事情就是构建组件。得益于其良好的封装性,组件使代码复用、测试和关注分离(separation of concerns)更加简单。 1.3、 React学习资源 React英文官网:https://reactjs.org/ React中文官网:https://react.docschina.org/ Github地址: https://github.com/facebook/react 极客学院:http://wiki.jikexueyuan.com/project/react/ 菜鸟教程:http://www.runoob.com/react/react-tutorial.html react.js 中文论坛:http://www.react-china.org

YII2

 

我们用实例来说明这一部分

表结构

现在有客户表、订单表、图书表、作者表,

  • 客户表Customer   (id  customer_name)
  • 订单表Order          (id  order_name       customer_id   book_id)
  • 图书表                    (id  book_name       author_id)
  • 作者表                    (id  author_name)



模型定义

下面是这4个个模型的定义,只写出其中的关联

Customer 

  1. class Customer extends \yii\db\ActiveRecord
  2. {
  3.     // 这是获取客户的订单,由上面我们知道这个是一对多的关联,一个客户有多个订单
  4.     public function getOrders()
  5.     {
  6.         // 第一个参数为要关联的子表模型类名,
  7.         // 第二个参数指定 通过子表的customer_id,关联主表的id字段
  8.         return $this->hasMany(Order::className(), ['customer_id' => 'id']);
  9.     }
  10. }
复制代码

Order 

  1. class Order extends \yii\db\ActiveRecord
  2. {
  3.     // 获取订单所属用户
  4.     public function getCustomer()
  5.     {
  6.         //同样第一个参数指定关联的子表模型类名
  7.         //
  8.         return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
  9.     }
  10.     // 获取订单中所有图书
  11.     public function getBooks()
  12.     {
  13.         //同样第一个参数指定关联的子表模型类名
  14.         //
  15.         return $this->hasMany(Book::className(), ['id' => 'book_id']);
  16.     }
  17. }
复制代码

Book 

  1. class Book extends \yii\db\ActiveRecord
  2. {
  3.     // 获取图书的作者
  4.     public function getAuthor()
  5.     {
  6.         //同样第一个参数指定关联的子表模型类名
  7.         return $this->hasOne(Author::className(), ['id' => 'author_id']);
  8.     }
  9. }
复制代码

Author 

  1. class Autor extends \yii\db\ActiveRecord
  2. {
  3.   
  4. }
复制代码



hasMany、hasOne使用

Yii2中的表之间的关联有2种,它们用来指定两个模型之间的关联。

  • 一对多:hasMany
  • 一对一:hasOne

 

  • 返回结果:这两个方法的返回结果都为yii\db\ActiveQuery对象
  • 第一个参数:所关联的模型的类名称。
  • 第二个参数:是一个数组,其中键为所关联的模型中的属性,值为当前模型中的属性。



关联的使用

现在我们获取一个客户的所有的订单信息

  1. // 获取一个客户信息
  2. $customer = Customer::findOne(1);
  3. $orders = $customer->orders;  // 通过在Customer中定义的关联方法(getOrders())来获取这个客户的所有的订单。
复制代码

上面的两行代码会生成如下sql语句

  1. SELECT * FROM customer WHERE id=1;
  2. SELECT * FROM order WHERE customer_id=1;
复制代码



关联结果缓存

如果客户的订单改变了,我们再重新调用

  1. $orders = $customer->orders;
复制代码

再次得到订单的时候你会发现没有变化。原因是只会在第一次执行$customer->orders的时候才会去数据库里面查询,然后会把结果缓存起来,以后查询的时候都不会再执行sql。

那么如果我想再次执行sql如何做呢?可以执行

  1. unset($customer->orders);
  2. $customer->orders;
复制代码

然后就可以从数据库里面取数据了。


定义多个关联

同样,我们还可以在Customer里面定义多个关联。
如返回总数大于100的订单。

  1. class Customer extends \yii\db\ActiveRecord
  2. {
  3.     public function getBigOrders($threshold = 100)
  4.     {
  5.         return $this->hasMany(Order::className(), ['customer_id' => 'id'])
  6.             ->where('subtotal > :threshold', [':threshold' => $threshold])
  7.             ->orderBy('id');
  8.     }
  9. }
复制代码



关联的两种访问方式

如上面的,如果使用

  1. $customer->bigOrders
复制代码

将会得到大于100的所有的订单。如果要返回大于200的订单可以这样写

  1. $orders = $customer->getBigOrders(200)->all();
复制代码

从上面可以看出访问一个关联的时候有两种方法

  • 如果以函数的方式调用,会返回一个 ActiveQuery 对象($customer->getOrders()->all())
  • 如果以属性的方式调用,会直接返回模型的结果($customer->orders)



with的使用看如下代码,是取一个客户的订单

  1. // 执行sql语句: SELECT * FROM customer WHERE id=1
  2. $customer = Customer::findOne(1);
  3. //执行sql:SELECT * FROM order WHERE customer_id=1
  4. $orders1 = $customer->orders;
  5. //这个不会执行sql,直接使用上面的缓存结果
  6. $orders2 = $customer->orders;
复制代码

如果现在我们要取出100个用户,然后访问每个用户的订单,从上面的了解我们可能会写出如下代码

  1. // 执行sql语句: SELECT * FROM customer LIMIT 100
  2. $customers = Customer::find()->limit(100)->all();
  3. foreach ($customers as $customer) {
  4.     // 执行sql: SELECT * FROM order WHERE customer_id=...
  5.     $orders = $customer->orders;
  6.     // 处理订单。。。
  7. }
复制代码

然而,如果真要这样写的话,会在foreach的每个循环里面都执行一次sql去数据库里面查询数据。因为每个$customer对象都是不一样的。

为了解决上面的问题 可以使用 yii\db\ActiveQuery::with()
其中width的参数为关系的名称,也就在model里面定义的getOrders,getCustomer中的orders和customer

  1. // 先执行sql: SELECT * FROM customer LIMIT 100;
  2. //               SELECT * FROM orders WHERE customer_id IN (1,2,...)
  3. $customers = Customer::find()->limit(100)
  4.     ->with('orders')->all();
  5. foreach ($customers as $customer) {
  6.     // 在这个循环的时候就不会再执行sql了
  7.     $orders = $customer->orders;
  8.     // ...handle $orders...
  9. }
复制代码


如果使用了select来指定返回的列,一定要确保返回的列里面包含所关联的模型的关联字段,否则将不会返回关联的表的Model

  1. $orders = Order::find()->select(['id', 'amount'])->with('customer')->all();
  2. // $orders[0]->customer 的结果将会是null
  3. // 因为上面的select中没有返回所关联的模型(customer)中的指定的关联字段。
  4. // 如果加上customer_id,$orders[0]->customer就可以返回正确的结果
  5. $orders = Order::find()->select(['id', 'amount', 'customer_id'])->with('customer')->all();
复制代码



给with加过滤条件

查询一个客户大于100的订单

  1. //首先执行sql: SELECT * FROM customer WHERE id=1
  2. $customer = Customer::findOne(1);
  3. // 再执行查询订单的sql语句:SELECT * FROM order WHERE customer_id=1 AND subtotal>100
  4. $orders = $customer->getOrders()->where('subtotal>100')->all();
复制代码

查询100个客户的,每个客户的总合大于100的订单

  1. // 下面的代码会执行sql语句: 
  2. // SELECT * FROM customer LIMIT 100
  3. // SELECT * FROM order WHERE customer_id IN (1,2,...) AND subtotal>100
  4. $customers = Customer::find()->limit(100)->with([
  5.     'orders' => function($query) {
  6.         $query->andWhere('subtotal>100');
  7.     },
  8. ])->all();
复制代码

在这里width的参数为数组,键为关联的名称,值为回调函数。

也就是说 对orders这个关联返回的ActiveQuery,再执行一次$query->andWhere('subtotal>100');



使用joinWith进行表关联

我们都知道可以用join on来写多个表之间的关联。先看看yii2中joinWit的声明
joinWith( $with, $eagerLoading = true, $joinType = 'LEFT JOIN' )

  • $with 数据类型为字符串或数组,
    如果为字符串,则为模型中定义的关联的名称(可以为子关联)。
    如果为数组,键为model中以getXXX格式定义的关联,值为对这个关联的进一步的回调操作。
  • $eagerLoading 是否加载在$with中关联的模型的数据。
  • $joinType 联接类型,可用值为:LEFT JOIN、INNER JOIN,默认值为LEFT JOIN

 

  1. // 订单表和客户表以Left join的方式关联。
  2. // 查找所有订单,并以客户 ID 和订单 ID 排序
  3. $orders = Order::find()->joinWith('customer')->orderBy('customer.id, order.id')->all();
  4. // 订单表和客户表以Inner join的方式关联
  5. // 查找所有的订单和书
  6. $orders = Order::find()->innerJoinWith('books')->all();
复制代码
  1. // 使用inner join 连接order中的 books关联和customer关联。
  2. // 并对custmer关联再次进行回调过滤:找出24小时内注册客户包含书籍的订单
  3. $orders = Order::find()->innerJoinWith([
  4.     'books',
  5.     'customer' => function ($query) {
  6.         $query->where('customer.created_at > ' . (time() - 24 * 3600));
  7.     }
  8. ])->all();
  9. // 使用left join连接 books关联,books关联再用left join 连接 author关联
  10. $orders = Order::find()->joinWith('books.author')->all();
复制代码


在实现上,Yii 先执行满足JOIN查询条件的SQL语句,把结果填充到主模型中, 然后再为每个关联执行一条查询语句, 并填充相应的关联模型。

  1. // Order和books关联 inner join ,但不获取books关联对应的数据
  2. $orders = Order::find()->innerJoinWith('books', false)->all();
复制代码




On条件


在定义关联的时候还可以指定on条件

  1. class User extends ActiveRecord
  2. {
  3.     public function getBooks()
  4.     {
  5.         return $this->hasMany(Item::className(), ['owner_id' => 'id'])->onCondition(['category_id' => 1]);
  6.     }
  7. }
复制代码


在joinWith中使用

  1. //先查询主模型(User)的数据, SELECT user.* FROM user LEFT JOIN item ON item.owner_id=user.id AND category_id=1
  2. // 然后再根据关联条件查询相关模型数据SELECT * FROM item WHERE owner_id IN (...) AND category_id=1
  3. // 这两个在查询的过程中都使用了 on条件。
  4. $users = User::find()->joinWith('books')->all();
复制代码


如果没有使用join操作,即使用的是with 或者 直接以属性来访问关联。这个时候on条件会作为where 条件。

  1. // SELECT * FROM user WHERE id=10
  2. $user = User::findOne(10);
复制代码




总结

  • 首先需要在模型中定义好关联(如getOrders中的Orders为一个关联)
  • 然后在with或者joinWith中使用在模型中定义的关联。
  • 其中在使用关联的时候还可以指定回调方法。
  • 再有就是可以给关联、with、joinWith指定where或者on条件

sql server Yii2 起步

一、加入微软的源 curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssqlrelease.repo
二、防止冲突先卸载原有版本(可选) yum remove unixODBC
三、安装驱动(三个都要装上,缺一不可) yum install msodbcsql mssql-tools unixODBC-devel
四、下载pdo_sqlsrv扩展包 http://pecl.php.net/package/pdo_sqlsrv 五、以4.0.8为例 tar -zxvf pdo_sqlsrv-4.0.8.tgz
六、进入解压目录 cd pdo_sqlsrv-4.0.8
七、执行PHP的一个扩展命令 /usr/local/php/bin/phpize
八、编译 ./configure --with-php-config=/usr/local/php/bin/php-config
九、安装 make && make install
十、修改/usr/local/php/etc/php.ini 查找:extension = 再最后一个extension= 后面添加上extension = "pdo_sqlsrv.so"

Elements

Text

This is bold and this is strong. This is italic and this is emphasized. This is superscript text and this is subscript text. This is underlined and this is code: for (;;) { ... }. Finally, this is a link.


Heading Level 2

Heading Level 3

Heading Level 4

Heading Level 5
Heading Level 6

Blockquote

Fringilla nisl. Donec accumsan interdum nisi, quis tincidunt felis sagittis eget tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan faucibus. Vestibulum ante ipsum primis in faucibus lorem ipsum dolor sit amet nullam adipiscing eu felis.

Preformatted

i = 0;

while (!deck.isInOrder()) {
    print 'Iteration ' + i;
    deck.shuffle();
    i++;
}

print 'It took ' + i + ' iterations to sort the deck.';

Lists

Unordered

  • Dolor pulvinar etiam.
  • Sagittis adipiscing.
  • Felis enim feugiat.

Alternate

  • Dolor pulvinar etiam.
  • Sagittis adipiscing.
  • Felis enim feugiat.

Ordered

  1. Dolor pulvinar etiam.
  2. Etiam vel felis viverra.
  3. Felis enim feugiat.
  4. Dolor pulvinar etiam.
  5. Etiam vel felis lorem.
  6. Felis enim et feugiat.

Icons

Actions

Table

Default

Name Description Price
Item One Ante turpis integer aliquet porttitor. 29.99
Item Two Vis ac commodo adipiscing arcu aliquet. 19.99
Item Three Morbi faucibus arcu accumsan lorem. 29.99
Item Four Vitae integer tempus condimentum. 19.99
Item Five Ante turpis integer aliquet porttitor. 29.99
100.00

Alternate

Name Description Price
Item One Ante turpis integer aliquet porttitor. 29.99
Item Two Vis ac commodo adipiscing arcu aliquet. 19.99
Item Three Morbi faucibus arcu accumsan lorem. 29.99
Item Four Vitae integer tempus condimentum. 19.99
Item Five Ante turpis integer aliquet porttitor. 29.99
100.00

Buttons

  • Disabled
  • Disabled

Form