接上一篇 基于yii2的blog系统开发1:

第四步 用gii生成crud的相关文件

1.访问http://yourhost/advanced/backend/web/index.php?r=gii

2.先生成models

post,poststatus,comment,commentstatus,user,adminuser,tag这7个表的model

3.然后生成crud

post,comment,user,adminuser

4.修改backend/views/web.php,在导航栏添加菜单,方便链接到管理页面

......
$menuItems = [
      //  ['label' => 'Home', 'url' => ['/site/index']],
        ['label' => '文章管理', 'url' => ['/post/index']],
        ['label' => '评论管理', 'url' => ['/comment/index']],
        ['label' => '用户管理', 'url' => ['/user/index']],
        ['label' => '管理员用户管理', 'url' => ['/adminuser/index']],
    ];
......

第五步 数据库操作

(这块内容可以先跳过,后面用到时候再详细了解,weixi老师的视频里面先讲到了,我就先记录下来)

第一种方式createCommand

简单,但不推荐,移植数据库不方便,建议只用作测试代码
yii::$app->db->createCommand("select * from post where id=:id")->bindValue(":id",1)->queryOne();//返回数组

User::findBySql('SELECT * FROM user')->all(); 此方法是用 sql 语句查询 user 表里面的所有数据对象数组;

User::findBySql('SELECT * FROM user')->one(); 此方法是用 sql 语句查询 user 表里面的一条数据对象;

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

//查询一条记录
//$model = Post::find()->where(["id"=>1])->one();
$model = Post::findOne(1);//简写
var_dump($model);
exit(0);

//查询多条记录
//$models = Post::find()->where(["status"=>1])->all();
$models = Post::findAll(["status"=>1]);//简写

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

$model = Post::findOne(1);
echo $model->id;
echo $model->title;

$models = Post::findAll(["status"=>1]);
foreach($models as $item){
    echo $item->id;
    echo $item->title.'<br>';
}

2.利用AR对象特点替代sql执行crud

//create
$post1 = new Post();
$post1->title='haha';
$post1->save();
//read
$post2=Post::findOne($id);
//update
$post2->title="haha2";
$post2->save();
//delete
$post2->delete();


$row = (new \yii\db\Query())->select(['id','email'])->from('user')->where('last_name=>:lname')->addParams([':lname'=>$ln])->orderBy(['id'=>SORT_ASC,'name'=>SORT_DESC])-> limit(10)->indexBy(id)->all();

第六步 面包屑,按钮,文章属性改为中文

面包屑按钮改为中文

修改backend/views/post目录下面对应的页面

文章属性改为中文

修改common/models/Post.php:

public function attributeLabels()
    {
        return [
            'id' => '索引',
            'title' => '标题',
            'content' => '内容',
            'tags' => '标签',
            'status' => '状态',
            'create_time' => '创建时间',
            'update_time' => '更新时间',
            'author_id' => '作者',
        ];
    }

补充关于数据库AR操作

AR查询
$model->find()->all(); //返回所有数据;

$model->findOne($id); //返回 主键 id=1 的一条数据;

$model->find()->select([‘id’,’title’])->all(); //返回指定字段数据

$model->find()->where([’name’ => ’名称’])->one(); //返回 [’name’ => ’小伙儿’] 的一条数据;

$model->find()->where([’name’ => ’名称’])->all(); //返回 [’name’ => ’小伙儿’] 的所有数据;

$model->find()->orderBy(’id DESC’)->all(); //排序查询;

$model->findBySql(’SELECT * FROM user’)->all(); //用 sql 语句查询 user 表里面的所有数据;

$model->findBySql(’SELECT * FROM user’)->one(); //用 sql 语句查询 user 表里面的一条数据;

$model->find()->andWhere([’sex’ => ’男’, ’age’ => ’24’])->count(’id’); //统计符合条件的总条数;

$model->find()->andFilterWhere([’like’, ’name’, ’名称’]); //用 like 查询 name 等于 小伙儿的 数据

$model->find()->one(); //返回一条数据;

$model->find()->all(); //返回所有数据;

$model->find()->count(); //返回记录的数量;

$model->find()->average(); //返回指定列的平均值;

$model->find()->min(); //返回指定列的最小值 ;

$model->find()->max(); //返回指定列的最大值 ;

$model->find()->scalar(); //返回值的第一行第一列的查询结果;

$model->find()->column(); //返回查询结果中的第一列的值;

$model->find()->exists(); //返回一个值指示是否包含查询结果的数据行;

$model->find()->batch(10); //每次取 10 条数据

$model->find()->each(10); //每次取 10 条数据, 迭代查询

Join关联
$_list = $model::find();
$_list->select([‘f.id’,’f.dateline’,’n.itemid’,’n.title’]);
$_list->from(News::tableName() . ‘ as f’);
$_list->where([‘f.userid’=>5]);
$_list->joinWith(‘newsTitle as n’ , false, ‘LEFT JOIN’);

where查询条件总结

  1. static where( $condition )
    其中参数 $condition类型为字符串或者数组1、字符串字符串是最简单的,直接按sql中的where条件写就可以,如

$condition = ’name=’zhidemy.com’ and age>10’;

  1. 如果是数组的情况下,有两种格式的写法。

[’type’ => 1, ’status’ => 2] //生成 (type = 1) AND (status = 2)

[’id’ => [1, 2, 3], ’status’ => 2] //生成 (id IN (1, 2, 3)) AND (status = 2)

[’status’ => null] //生成 status IS NULL

  1. AND 把所有的操作数连接起来。
    [’and’, ’id=1’, ’id=2’] //生成 id=1 AND id=2

如果某个运算数也是数组,那么会按如下格式转换为字符串

[’and’, ’type=1’, [’or’, ’id=1’, ’id=2’]] //生成 type=1 AND (id=1 OR id=2)

or和and类似,只不过是用OR来连接操作数。注意:这个方法不会对进行引用或者编码操作。

  1. between 第一个操作数是列的名称,第二个和第三个操作数为范围的最小值和最大值。
    [’between’, ’id’, 1, 10] //生成 id BETWEEN 1 AND 10

not between:和between相似。

  1. in 第一个操作数为列或者DB表达式,第二个操作数为数组
    [’in’, ’id’, [1, 2, 3]] //生成 id IN (1, 2, 3)

not in和in相似。注意:这个方法会对列进行引用,对数组中的值也会编码。

  1. like 第一个操作数为列或者DB表达式,第二个操作数为字符串或者数组如
    [’like’, ’name’, ’tester’] //生成 name LIKE ’%tester%’

如果值是数组的话,会生成多个like语句,并用AND来连接。如

[’like’, ’name’, [’test’, ’sample’]] //生成 name LIKE ’%test%’ AND name LIKE ’%sample%’

注意:这个方法会对列进行引用,对数组中的值也会编码。有时候你可能需要自己来处理%,那么可以用第三个参数:

[’like’, ’name’, ’%tester’, false] //生成 name LIKE ’%tester’

or like 和 like 相似,只是在第二个参数为数组的情况下用or来连接多个like 语句。
not like和 like 相似。
or not like 和or like相似。