紫悦博客

不进则退,退一步万丈悬崖!

0%

上一篇:Yii2.0数据库查询应用实例(一)

findOne()和findAll()

1
2
3
// 查询key值为10的客户
$customer = Customer::findOne(10);
$customer = Customer::find()->where(['id' => 10])->one();
1
2
3
// 查询年龄为30,状态值为1的客户
$customer = Customer::findOne(['age' => 30, 'status' => 1]);
$customer = Customer::find()->where(['age' => 30, 'status' => 1])->one();
1
2
3
// 查询key值为10的所有客户
$customers = Customer::findAll(10);
$customers = Customer::find()->where(['id' => 10])->all();
1
2
3
// 查询key值为10,11,12的客户
$customers = Customer::findAll([10, 11, 12]);
$customers = Customer::find()->where(['id' => [10, 11, 12]])->all();
1
2
3
// 查询年龄为30,状态值为1的所有客户
$customers = Customer::findAll(['age' => 30, 'status' => 1]);
$customers = Customer::find()->where(['age' => 30, 'status' => 1])->all();

where()条件

1
$customers = Customer::find()->where($cond)->all(); 

$cond写法举例:

1
2
// SQL: (type = 1) AND (status = 2).
$cond = ['type' => 1, 'status' => 2]
1
2
// SQL:(id IN (1, 2, 3)) AND (status = 2)
$cond = ['id' => [1, 2, 3], 'status' => 2]
1
2
//SQL:status IS NULL
$cond = ['status' => null]

[[and ]]:将不同的条件组合在一起,用法举例:

1
2
3
4
5
//SQL:`id=1 AND id=2`
$cond = ['and', 'id=1', 'id=2']

//SQL:`type=1 AND (id=1 OR id=2)`
$cond = ['and', 'type=1', ['or', 'id=1', 'id=2']]

[[or]]:

1
2
//SQL:`(type IN (7, 8, 9) OR (id IN (1, 2, 3)))`
$cond = ['or', ['type' => [7, 8, 9]], ['id' => [1, 2, 3]]

[[not]]:

1
2
//SQL:`NOT (attribute IS NULL)`
$cond = ['not', ['attribute' => null]]

[[between ]]: not between 用法相同

1
2
//SQL:`id BETWEEN 1 AND 10`
$cond = ['between', 'id', 1, 10]

[[in]]: not in 用法类似

1
2
3
4
5
6
7
8
//SQL:`id IN (1, 2, 3)`
$cond = ['in', 'id', [1, 2, 3]]

//IN条件也适用于多字段
$cond = ['in', ['id', 'name'], [['id' => 1, 'name' => 'foo'], ['id' => 2, 'name' => 'bar']]]

//也适用于内嵌sql语句
$cond = ['in', 'user_id', (new Query())->select('id')->from('users')->where(['active' => 1])]

[[like]]:

1
2
3
4
5
6
7
8
//SQL:`name LIKE '%tester%'`
$cond = ['like', 'name', 'tester']

//SQL:`name LIKE '%test%' AND name LIKE '%sample%'`
$cond = ['like', 'name', ['test', 'sample']]

//SQL:`name LIKE '%tester'`
$cond = ['like', 'name', '%tester', false]

[[exists]]: not exists用法类似

1
2
//SQL:EXISTS (SELECT "id" FROM "users" WHERE "active"=1)
$cond = ['exists', (new Query())->select('id')->from('users')->where(['active' => 1])]

此外,您可以指定任意运算符如下

1
2
3
4
5
//SQL:`id >= 10`
$cond = ['>=', 'id', 10]

//SQL:`id != 10`
$cond = ['!=', 'id', 10]

下一篇:Yii2.0数据库查询实例(三)

来源:http://www.yii-china.com/post/detail/8.html

1.简单查询:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
[[one()]]: 根据查询结果返回查询的第一条记录。

[[all()]]: 根据查询结果返回所有记录。

[[count()]]: 返回记录的数量。

[[sum()]]: 返回指定列的总数。

[[average()]]: 返回指定列的平均值。

[[min()]]: 返回指定列的最小值。

[[max()]]: 返回指定列的最大值。

[[scalar()]]: 返回查询结果的第一行中的第一列的值。

[[column()]]: 返回查询结果中的第一列的值。

[[exists()]]: 返回一个值,该值指示查询结果是否有数据。

[[where()]]: 添加查询条件

[[with()]]: 该查询应执行的关系列表。

[[indexBy()]]: 根据索引的列的名称查询结果。

[[asArray()]]: 以数组的形式返回每条记录。
应用实例:

Customer::find()->one(); 此方法返回一条数据;

Customer::find()->all(); 此方法返回所有数据;

Customer::find()->count(); 此方法返回记录的数量;

Customer::find()->average(); 此方法返回指定列的平均值;

Customer::find()->min(); 此方法返回指定列的最小值 ;

Customer::find()->max(); 此方法返回指定列的最大值 ;

Customer::find()->scalar(); 此方法返回值的第一行第一列的查询结果;

Customer::find()->column(); 此方法返回查询结果中的第一列的值;

Customer::find()->exists(); 此方法返回一个值指示是否包含查询结果的数据行;
Customer::find()->asArray()->one(); 以数组形式返回一条数据;

Customer::find()->asArray()->all(); 以数组形式返回所有数据;
Customer::find()->where($condition)->asArray()->one(); 根据条件以数组形式返回一条数据;

Customer::find()->where($condition)->asArray()->all(); 根据条件以数组形式返回所有数据;
Customer::find()->where($condition)->asArray()->orderBy('id DESC')->all(); 根据条件以数组形式返回所有数据,并根据ID倒序;

2.关联查询:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[[ActiveRecord::hasOne()]]:返回对应关系的单条记录
[[ActiveRecord::hasMany()]]:返回对应关系的多条记录
应用实例:

//客户表Model:CustomerModel
//订单表Model:OrdersModel
//国家表Model:CountrysModel
//首先要建立表与表之间的关系
//在CustomerModel中添加与订单的关系

Class CustomerModel extends \yii\db\ActiveRecord
{
...

public function getOrders()
{
//客户和订单是一对多的关系所以用hasMany
//此处OrdersModel在CustomerModel顶部别忘了加对应的命名空间
//id对应的是OrdersModel的id字段,order_id对应CustomerModel的order_id字段
return $this->hasMany(OrdersModel::className(), ['id'=>'order_id']);
}

public function getCountry()
{
//客户和国家是一对一的关系所以用hasOne
return $this->hasOne(CountrysModel::className(), ['id'=>'Country_id']);
}
....
}

// 查询客户与他们的订单和国家
CustomerModel::find()->with('orders', 'country')->all();

// 查询客户与他们的订单和订单的发货地址
CustomerModel::find()->with('orders.address')->all();

// 查询客户与他们的国家和状态为1的订单
CustomerModel::find()->with([
'orders' => function ($query) {
$query->andWhere('status = 1');
},
'country',
])->all();

注:with中的orders对应getOrders

常见问题:

1.在查询时加了->select();如下,要加上order_id,即关联的字段(比如:order_id)比如要在select中,否则会报错:undefined index order_id

// 查询客户与他们的订单和国家

1
CustomerModel::find()->select('order_id')->with('orders', 'country')->all();

下一篇:Yii2.0数据库查询应用实例(二)

来源:http://www.yii-china.com/post/detail/7.html

required : 必须值验证属性

[['字段名'],required,'requiredValue'=>'必填值','message'=>'提示信息']; #说明:CRequiredValidator 的别名, 确保了特性不为空.

email : 邮箱验证

['email', 'email']; #说明:CEmailValidator的别名,确保了特性的值是一个有效的电邮地址.

match : 正则验证

[['字段名'],match,'pattern'=>'正则表达式','message'=>'提示信息'];      

[['字段名'],match,'not'=>ture,'pattern'=>'正则表达式','message'=>'提示信息']; /*正则取反*/ #说明:CRegularExpressionValidator 的别名, 确保了特性匹配一个正则表达式.

url : 网址

['website', 'url', 'defaultScheme' => 'http']; #说明:CUrlValidator 的别名, 确保了特性是一个有效的路径.

captcha : 验证码

['verificationCode', 'captcha']; #说明:CCaptchaValidator 的别名,确保了特性的值等于 CAPTCHA 显示出来的验证码.

safe : 安全

['description', 'safe'];

compare : 比较

['age', 'compare', 'compareValue' => 30, 'operator' => '>=']; #说明:compareValue(比较常量值) - operator(比较操作符)  #说明:CCompareValidator 的别名,确保了特性的值等于另一个特性或常量.

default : 默认值

['age', 'default', 'value' => null]; #说明:CDefaultValueValidator 的别名, 为特性指派了一个默认值.

exist : 存在

['username', 'exist']; #说明:CExistValidator 的别名,确保属性值存在于指定的数据表字段中.

file : 文件

['primaryImage', 'file', 'extensions' => ['png', 'jpg', 'gif'], 'maxSize' => 1024*1024*1024]; #说明:CFileValidator 的别名, 确保了特性包含了一个上传文件的名称.

filter : 滤镜

[['username', 'email'], 'filter', 'filter' => 'trim', 'skipOnArray' => true]; #说明:CFilterValidator 的别名, 使用一个filter转换属性.

in : 范围

['level', 'in', 'range' => [1, 2, 3]]; #说明:CRangeValidator 的别名,确保了特性出现在一个预订的值列表里.

unique : 唯一性

['username', 'unique'] #说明:CUniqueValidator 的别名,确保了特性在数据表字段中是唯一的.

integer : 整数

['age', 'integer'];

number : 数字

['salary', 'number'];

double : 双精度浮点型

['salary', 'double'];

date : 日期

[['from', 'to'], 'date'];

string : 字符串

['username', 'string', 'length' => [4, 24]];

boolean : 是否为一个布尔值

['字段名', 'boolean', 'trueValue' => true, 'falseValue' => false, 'strict' => true]; #说明:CBooleanValidator 的别名

image :是否为有效的图片文件

[‘primaryImage’,‘image’‘extensions’ => ‘png, jpg,jpeg’,‘minWidth’ => 100,‘maxWidth’ => 1000,‘minHeight’ => 100,‘maxHeight’ => 1000,]

有漏的大家可以留言补充。互相学习

通过 Composer 安装

这是安装Yii2.0的首选方法。如果你还没有安装Composer,你可以按照这里的说明进行安装。

安装完Composer,运行下面的命令来安装Composer Asset插件:

php composer.phar global require "fxp/composer-asset-plugin:~1.1.1"

现在选择的应用程序模板之一,开始安装 Yii 2.0。应用程序模板是一个包含Yii写的骨架Web应用程序包。

  • 安装基本的应用程序模板,运行下面的命令:

    php composer.phar create-project yiisoft/yii2-app-basic basic 2.0.6
  • 安装高级的应用程序模板,运行下面的命令:

    php composer.phar create-project yiisoft/yii2-app-advanced advanced 2.0.6

    请注意,您可能会被提示安装过程中输入你的 GitHub 的用户名和密码。这是正常的。只要输入它们并继续。

Yii安装参考资料:
[https://getcomposer.org/doc/00-intro.md#installation-nix](https://getcomposer.org/doc/00-intro.md#installation-nix)
>
Yii镜像
[http://pkg.phpcomposer.com](http://pkg.phpcomposer.com)
>
Yii2.0中文手册
[http://www.yii-china.com/doc/guide.html](http://www.yii-china.com/doc/guide.html)
[http://www.yiichina.com/doc/guide/2.0](http://www.yiichina.com/doc/guide/2.0)
[http://yii2.techbrood.com/guide-index.html](http://yii2.techbrood.com/guide-index.html)
>
Yii2.0官方手册
[http://www.yiiframework.com/doc-2.0/guide-index.html#getting-started](http://www.yiiframework.com/doc-2.0/guide-index.html#getting-started)
>
参考源码:
[http://www.yiichina.com/code/655](http://www.yiichina.com/code/655)

1. 采用Alcatraz来管理所有的插件

安装经验贴:http://blog.csdn.net/xiaoliuxingzi/article/details/46889429

2. ATProperty 快速生成属性的利器

3. Auto-Importer 添加头文件比较方便,不需要跳到.m文件的顶端去添加

4.AutoGenerateDescriptionPluginProd 这个是自动生成description的,自定义的对象调试方便

5.ESJsonFormat 这个是和MJExtension 配合使用生成对象,前提是服务端能提供接口的json示例。 复杂的结构中是非常有用的,比如一个对象以数组或者dic的形式包含若干个自定义的对象,这时候用json+这个插件来生成模型文件是非常方便的。

6.FuzzyAutocomplete 比XCode自带的更加好用。

7.iconMaker 根据一张原图自动生成并且配置好工程的icon

8.JDPluginManager 生成一个新的plugin条目,方便使用xcode插件

9.JKBlockCommenter 用command+option+/来给代码块加上/* */的注释

10.RRConstraintsPlugin  方便那些用 autoLayout来布局的人

11.RSImageOptimPlugin 能够优化工程中的图片,大幅度减小包的大小

12. KSImageNamed  imageName方法的时候图片名称的自动提示

———————————————————————————————–

上面这些插件都可以在Alcatraz找到,此外

 

13.Dash 一个文档插件

14.Xalign 代码整理插件

15. VVDocumenter  用”///”就能根据方法生成相应的注释模板

创建主索引:
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf news –rotate

创建增量索引:

/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf news_delta –rotate

合并主索引和增量索引:

/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf –merge news news_delta –rotate –merge-dst-range deleted 0 0

–rotate参数可以在不停searchd的情况下索引,不然的话会有类似如下的提示:
FATAL: failed to lock /usr/local/coreseek/var/data/hx_news_delta.spl: Resource temporarily unavailable, will not index. Try –rotate option.
ERROR: index ‘delta’ is already locked; lock: failed to lock /usr/local/coreseek/var/data/cncn_article_delta.spl: Resource temporarily unavailable

查看一台服务器上面哪些服务及端口

netstat  -lanp
查看一个服务有几个端口。比如要查看mysqld
ps -ef |grep mysqld
查看某一端口的连接数量,比如3306端口
netstat -pnt |grep :3306 |wc
查看某一端口的连接客户端IP 比如3306端口
netstat -anp |grep 3306
查看某一端口是否可以访问
telnet 127.0.0.1 3312
 

(一) 开天辟地入门篇
本系列文章将带您进入jQuery的精彩世界,其中有很多作者具体的使用经验和解决方案,即使你会使用jQuery也能在阅读中发现些许秘籍。本篇文章是入门第一篇,主要是简单介绍jQuery,通过简单示例指导大家如何编写jQuery代码以及搭建开发环境,详细讲解了如何在Visual Studio中配合使用jQuery。

(二) 万能的选择器

本章讲解jQuery最重要的选择器部分的知识。有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显减轻开发人员的工作量。

(三) 管理jQuery包装集

在使用jQuery选择器获取到jQuery包装集后, 我们需要对其进行操作。本章首先讲解如何动态的创建元素, 接着学习如何管理jQuery包装集, 比如添加,删除,切片等。

(四) 使用jQuery操作元素的属性与样式

本篇文章讲解如何使用jQuery获取和操作元素的属性和CSS样式,其中DOM属性和元素属性的区分值得大家学习。

(五) 事件与事件对象

事件是脚本编程的灵魂,所以本章内容也是jQuery学习的重点。本文将对jQuery中的事件处理以及事件对象进行详细的讲解。新鲜出炉, 走过路过不能错过!

(六) AJAX快餐

本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案, 即使你会使用jQuery也能在阅读中发现些许秘籍。本篇文章讲解如何使用jQuery方便快捷的实现Ajax功能,统一所有开发人员使用Ajax的方式。

(七) jQuery动画-让页面动起来!

本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案, 即使你会使用jQuery也能在阅读中发现些许秘籍。开发人员一直痛疼做动画,但是有了jQuery你会瞬间成为别人(那些不知道jQuery的人)眼里的动画高手!本文将介绍jQuery的动画相关函数。原来做动画如此简单!

(八) 插播:jQuery实施方案

本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案, 即使你会使用jQuery也能在阅读中发现些许秘籍。本篇文章属于临时插播, 用于介绍我在本公司的jQuery实施方案。

(九) jQuery工具函数

本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案, 即使你会使用jQuery也能在阅读中发现些许秘籍。我们经常要使用脚本处理各种业务逻辑, 最常见的就是数组和对象的操作。jQuery工具函数为我们操作对象和数组提供了便利条件。

(十) jQueryUI常用功能实战

本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案, 即使你会使用jQuery也能在阅读中发现些许秘籍。本文是实战篇,使用jQueryUI完成制作网站的大部分常用功能。

(十一) 实战表单验证与自动完成提示插件

本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案, 即使你会使用jQuery也能在阅读中发现些许秘籍。本文是介绍两个最常用的jQuery插件,分别用于表单验证和自动完成提示(类似google suggest)。

(剧场版) 你必须知道的javascript

本文是jQuery系列教程的剧场版, 即和jQuery这条主线无关, 主要介绍大家平时会忽略的一些JavaScript细节。适合希望巩固JavaScript理论知识和基础知识的开发人员阅读。

JQuery 选择器
2012-04-26 19:23
$() 是jQuery的一个工厂,可以把一个包含CSS选择器的字符串作为参数
例如:
$(‘.poem’) -> 获取到class=”poem”的所有元素
$(‘#pic .title’) -> 获取到id=”pic”下的所有class=”title”的元素
(和CSS选择器一样的方式)
.addClass(‘poem’)
在元素的class属性中加入poem,他的作用就是给元素添加CSS样式
与之相反的是
.removeClass(‘poem’)
$(‘.poem’).addClass(‘sized’) –> <div class=”poem sized”>
所有的开始class=”poem”的元素都会添加上sized
$(‘div’)   –> 获取页面上所有的div元素
JQuery选择器 CSS XPath
$(‘#plays > li’) –> id=”plays”的下一级元素中的所有li元素,仅为子元素不包括孙子元素等再下级的元素
$(‘#plays li’) –> id=”plays”之下的所有li元素
$(‘#plays li:not(poem)’)   –> id=”plays”之下所有class不含有poem的li元素,意思就是说将class=”poem”的li
元素剔除

XPath选择器
属性选择器
$(‘a[@href^=”mailto”]’)   -> 得到href值以mailto开头的所有a元素
$(‘a[@href$=”.pdf”]’) -> 得到href值以.pdf结尾的所有a元素
$(‘a[@href*=”shzh.net”]’) -> 得到href值中包含shzh.net的所有a元素
//属性选择器 不知道怎么的 不可以成功还会出错:例外被抛出且没有被接住
自定义选择器
$(‘div.plays:eq(1)’) -> 得到class=”plays”的所有div元素的第二项,eq(0)是获取第一项
//这个有点类似CSS中的伪类选择符a.pic:link{}, a.pic:hover{}
$(‘div.nth-child(0)’) -> 得到所有div元素父元素的第一个子元素

在来看看另外两个选择器:基于:eq()的:odd 和 :even
$(‘div:odd’) -> 在获取的所有div元素中获取下标是奇数的元素
$(‘div:even’) -> 上面的相反 在获取的所有div元素中获取下标是偶数的元素

$(‘#plays’).parent() -> 获取id=”plays”的父节点。
$(‘li:not([span]):odd’) -> 获取所有li 排除子元素是<span>的 并且 该li在集合中的下标是奇数的。
$(‘li:odd:not([span])’) -> 获取所有li 并且下标是奇数的,子元素不是<span>的
$(‘#plays’).next() -> 获取id=”plays”的下一个兄弟节点
$(‘#plays’).siblings() -> 获取id=”plays”的所有兄弟节点
$(‘#plays’).find(‘td:gt(0)’) -> 获取id=”plays”下的所有td元素,然后获取td下标大于0的 //find()
== $(‘#plays td:gt(0)’)
$(‘#plays’).find(‘td’) -> 获取id=”plays”下的所有td元素
== $(‘#plays td’)
$(‘td:contains(“kko”)’) -> 获取所有td中有文字kko的td
一个例子:
$(‘td:contains(“kko”)’).parent().find(‘td:not(:contains(“kko”))’).addClass(‘highlight’);
分步骤解释:
·首先获取所有的td中有文字kko的td $(‘td:contains(“kko”)’)
·获取到上一级父元素   .parent()
·查找子元素td中不包含文字kko的td .find(‘td:not(:contains(“kko”))’)
·添加class属性值highlight   .addClass(‘highlight’)

.get()
在JQuery中的JQuery对象中获取DOM元素的方式。因为上面介绍的选择器获取到的对象并非是DOM对象而是JQuery对象
,JQuery对象可以看做是具有一系列自己的方法的DOM集合对象。
$(‘div’).get(0) -> 获取到第一个div元素的DOM对象方式
== $(‘div’)[0]
$(‘div’).eq(0) -> 获取到第一个div元素的JQuery对象方式