1.Yii如何使用数据库

Yii通过数据库访问对象(Database Access Objects,简称DAO)来使用数据库的。

DAO建立在“PHP数据对象(PDO)之上,并提供一套面向对象的API来访问数据库”

2.数据库的连接

数据库的连接通常放在配置文件中,/common/config/main-local.php中。

'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=yii2advanced',
            'username' => 'root',
            'password' => 'root',
            'charset' => 'utf8',
        ],

这里表示会创建一个yii\db\Connection对象,并用这个对象访问数据库。

这个数据库连接对象的写法:Yii->$app->db

连接不同数据库的语句略微有些差异。

3,数据库查询(yii\db\Command)

用SQL查询语句来创建一个yii\db\Command的对象,调用对象的方法来执行SQL查询,返回值是字符型的数组。

$post  = Yii::$app->db->createCommand('SELECT * FROM post')->queryAll();

SQL语句还可以绑定参数。

$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')

->bindValue(':id',$_GET['id'])

->bindValue(':status',2)

->queryOne();

4,yii\db\Command的优缺点

1,简单,只需要处理sql语句和数组就行了(优点)

2,高效,通过sql语句来查询数据库非常高效。(优点)

----------------------------------------------------------

1,不同的数据库系统的sql语句会有些差别,因此无法做到代码适用于多种数据库系统。(缺点)

2,用数组,而没有用到面向对象的方式来管理数据,代码难维护。(缺点)

3,如果不小心,会留下SQL注入这种不安全因素。(缺点)

5,ActiveRecord

(1)

ActiveRecord(活动记录,简称AR类)提供了一项面向对象的接口,可以访问数据库中的数据。

一个AR类关联一张数据表,每个AR对象对应表中的一行

AR对象的属性,对应数据库的列

可以直接以面向对象的方式来操纵数据库中的数据(AR把数据库和模型建立的联系),这样就不需要写SQL语句就能实现数据库的访问了。

(2)声明ActiveRecord类

通过继承yii\db\ActiveRecord基类来声明一个AR类,并实现tableName方法,返回与之相关联的数据表的名称

class Post extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'post';
    }

AR提供了两种方法来构建DB查询,返回AR对象。

yii\db\ActiveRecord::find()

$model = Post::find()->where(['id' => 1])->one();

$model = Post::find()->where([status" => 1])->all();

这两个方法的简便替换方法是:

$model = Post::findOne(1)

$models = Post::findAll(['status' => 1])

(3)更为复杂的查询就得求助于类参考手册了。通过查询,得到复杂的查询需要借助ActiveQueryInterface这个接口。

ActiveQueryInterface的常用方法:

举例说明:

$post = Post::find()->where(['AND',['status' => 2],['author_id => 1'],['like',"title",'yii2']])->orderBy('id')->all();

此外可以通过 yii\db\ActiveRecord::findBySql()来进行数据查询,不常用。

$sql = 'SELECT * FROM post where status=1';

$posts = Post::findBySql($sql)->all();

(4)访问列数据

AR对象的属性,对应为数据行的列

$model = Post::findOne(1);

echo $model->id;

echo $model->title;

------------------------

$model = Post::findAll(['status' => 1]);

foreach($model as $item)

{
echo $item->id;

echo $item->title;

}

(5)操作数据CRUD

AR提供下边这些方法来实现插入,更新和删除等功能

yii\db\ActiveRecord::insert()

yii\db\ActiveRecord::update()

yii\db\ActiveRecord::delete()

yii\db\ActiveRecord::save()

(6)AR查询关联数据

ActiveRecord类通过hasOne或者hasMany方法来建立两张表的关联关系。

hasOne用于多对一,一对一的情况;hasMany用于一对多的情况

建立关联关系后,就可以像访问自己的类数据一样便捷地去访问关联表数据。

Gii会根据数据库表之间的关联关系,自动生成建立类之间关联关系的代码。

例如:

$thePost->status0->name

$thePost->comments

-----------------------------------------

public function getStatus0()

{

  return $this->hasOne(Poststatus::className(),['id' => 'status']);

}

-------------------------------------------------

public function getComments()

{

  return $this->hasMany(Comment::className(),['post_id' => 'id'])

}

6,查询构建器QueryBuilder

1,什么是查询构建器

查询构建器也是建立在DAO基础之上的,可让你创建程序化的,DBMS无关的SQL语句,并且,这样创建的SQL语句,比原生的SQL语句更加易读。更安全。

2,使用查询构建器的步骤

(1)构建查询:创建一个yii\db\Query对象来代表一条SELECT SQL语句,然后通过调用一套可以串起来的方法,比如select方法,from方法,where方法等这些方法,构建出可以满足一定要求的查询条件。

(2)执行查询。执行yii\db\Query的一个查询方法从数据库当中检索数据。例如:all(),one(),column()等这些查询方法。

$allStatus = (new \yii\db\Query())
->select(['name','id'])
->from('poststatus')
->indexBy('id')
->column();

总结:

Yii如何使用数据库的更多相关文章

  1. Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式']

    public function getMinLimit () {        $sql = "...";        $result = yii::app()->db-& ...

  2. 配置yii访问远程数据库

    1.将hdp002的数据库放到hdp004后,发现yii出现找不到表messages的迹象.用hdp002远程登录hdp004后发现,原来是hdp004没有授权给hdp002,用下面的sql语句即可: ...

  3. Yii框架 多数据库、主从、读写分离

    Yii是可以在配置文件里声明多个数据库连接,然后通过Yii::app()->db1,Yii::app()->db2...来访问它们,并且也实现了更高级(自动)的主从数据库功能. 最近因为一 ...

  4. Yii 2.0 数据库操作总结

    1. 概述 操作数据库有2种方式: DAO(data access object),不安全 ORM(onject relational mapping) 2. DAO Yii::app()->d ...

  5. Yii框架操作数据库的几种方式与mysql_escape_string

    一.Yii操作数据库的几种选择 1,PDO方式. $sql = "";//原生态sql语句 xx::model()->dbConnection->createComma ...

  6. Yii中的数据库事务的使用方法小结

    在项目中遇到批量删除的地方一般会使用到事务,下面列举一个用法实例与大家分享. 查看代码   打印 01 <?php 02 $array=array( 03     0=>array('us ...

  7. sql这两个表和查询的组合yii通过使用数据库查询

    sql两个表的组合查询  使用 join on 比如:两个表查询: select u.username, t.title from user u join task t on u.id = t.id; ...

  8. CSRF token 无法被验证. ----Yii连接数据库后数据库错误日志报错

    CSRF token 无法被验证. 我使用的是mongodb+ yii1.1 What is CSRF, please see the details here.  http://en.wikiped ...

  9. Yii MySQL修改数据库的数据

    最新学习Yii框架,分享一些学习心得,适合初学者,大神请按ctrl + w //第一种方法 <?php /* * $id 代表主键,可以是一个也可以是一个集合. * $attributes 代表 ...

随机推荐

  1. 2017-07-02(free uptime cat /proc/cpuinfo uname lsb_release)

    free -b 字节为单位显示 -k KB为单位显示,默认显示就是KB -m 以MB为单位显示 -g 以GB为单位显示 free -m free 显示说明 uptime 跟top命令第一行内容相同 c ...

  2. python_20_socket

    什么是socket? -- 通过各种协议,发送和接收数据,实现网络通信 -- 在python3中,网络发送只能发二进制数据 OSI七层模型是什么? 应用 表示 会话 传输 网络             ...

  3. lambda高级进阶--延迟执行

    前面的整理我们也已经说到了,使用lambda表达式的主要原因是,将代码的执行延迟到一个合适的时间点.在使用lambda表达式的时候务必记住一点就是说lambda表达式都是延迟执行的. 延迟执行代码的原 ...

  4. jdk源码->集合->HashSet

    类的属性 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, ...

  5. convert图像格式批量转换

    问题:利用GMT绘制生成了eps格式的图像,为了将图像插入到word中,且保持较高的分辨率,利用convert进行图像格式转换,将eps转换成tiff格式. code:  $i ${name}.tif ...

  6. 【转】高斯-克吕格投影与UTM投影异同

    高斯-克吕格(Gauss-Kruger)投影与UTM投影(Universal Transverse Mercator,通用横轴墨卡托投影)都是横轴墨卡托投影的变种,目前一些国外的软件或国外进口仪器的配 ...

  7. javaScript补充

    一.字符串常用的方法 obj.length 长度 obj.trim() 移除前后空白 obj.trimLeft() 移除前空白 obj.trimRight() 移除后空白 obj.charAt(n) ...

  8. html5的video标签自动播放

    概念澄清 这里的"自动播放",是指用户的视觉效果,并不一定是元素自身的自动播放. 查看相关文档后,有以下两种最简方案. 配置属性 发现有video标签有一个自动播放的属性autop ...

  9. 洛谷 [p2294] [HNOI2005] 狡猾的商人

    差分约束做法 又是一道转换成前缀和的差分约束题,已知从s月到t月的收入w,设数组pre[i]代表从开始到第i个月的总收入 构造差分不等式 $ pre[s-1]-pre[t]==w $ 为了满足松弛操作 ...

  10. BZOJ 1927: [Sdoi2010]星际竞速 [上下界费用流]

    1927: [Sdoi2010]星际竞速 题意:一个带权DAG,每个点恰好经过一次,每个点有曲速移动到他的代价,求最小花费 不动脑子直接上上下界费用流过了... s到点连边边权为曲速的代价,一个曲速移 ...