接上一篇 基于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查询条件总结
- static where( $condition )
其中参数 $condition类型为字符串或者数组1、字符串字符串是最简单的,直接按sql中的where条件写就可以,如
$condition = ’name=’zhidemy.com’ and age>10’;
- 如果是数组的情况下,有两种格式的写法。
[’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
- 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来连接操作数。注意:这个方法不会对进行引用或者编码操作。
- between 第一个操作数是列的名称,第二个和第三个操作数为范围的最小值和最大值。
[’between’, ’id’, 1, 10] //生成 id BETWEEN 1 AND 10
not between:和between相似。
- in 第一个操作数为列或者DB表达式,第二个操作数为数组
[’in’, ’id’, [1, 2, 3]] //生成 id IN (1, 2, 3)
not in和in相似。注意:这个方法会对列进行引用,对数组中的值也会编码。
- 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相似。