yii2项目实战-多表关联操作
本来这一章节的标题是富文本编辑器和日期组件的使用,老朋友们应该都清楚,关于富文本和日期组件,前面我们有相关博客已经写的那是相当的明白,我是实在也写不出来新鲜的感觉了,现在一周写1-3篇文章也很赶,毕竟只是业余时间去写。
但是写文章的动力和激情那是磨灭不了的!好了,废话不多说了,我们这里贴一下富文本编辑器和日期时间组件使用的链接,一路跟着实战的朋友可以去参考一下,有任何问题留言即可。
我们来看今天的重点:如何实现多表关联操作。
任务需求:
假设我们要创建文章,在创建文章的表单页面,要同时选择相应的栏目。且文章跟栏目是一对多的关系,也就是说创建文章的时候要选择多个所属栏目。
数据表的分析:
- 需要博客表 blog
- 需要栏目表 category
- 需要博客和栏目的关联表 blog_category
很显然,一篇文章可以对应多个栏目,而一个栏目也对应着多篇文章。即二者之间是多对多的关系。
blog表和category表先前已创建,这里我们再创建一个关联表 blog_category
CREATE TABLE `blog_category` ( `blog_id` int(11) NOT NULL COMMENT '文章ID', `category_id` int(11) NOT NULL COMMENT '栏目ID', KEY `blog_id` (`blog_id`), KEY `category_id` (`category_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='文章-栏目关联表';
具体实现:
先看controller层,如果我们要单纯的创建一个表单模型,只需要为 ActiveForm 传递该模型的实例即可。但是,对于 Blog 模型表单,如何增加显示一个blog数据表不存在的栏目选项呢?
这个很简单,我们只需要在 common\models\Blog 模型中声明一个栏目属性,并添加相应的rules。
提醒:如果已经存在了某字段,尽量不要再声明属性,避免踩坑。
class Blog extends \yii\db\ActiveRecord { // ... public $category; //... public function rules() { return [ [['title', 'content', 'category'], 'required'], //... ]; } }
我们想要该字段的展示形式自然是复选框checkbox。构建该字段之前,我们先在 common\models\Category 模型类中增加一个可以获取所有栏目的方法,该方法中涉及到关于工具类 yii\helpers\ArrayHelper 的使用,需要提醒的是,该工具类的使用日后那绝对是非常普遍的。这里不再说明 yii\helpers\ArrayHelper::map的用法,可手动打印 dropDownList 方法的返回值自行体会,亦可自己去研究下源码哦。
common\models\Category类增加 dropDownList 方法,获取栏目id,栏目名的键值对
use yii\helpers\ArrayHelper; /** * 获取栏目的枚举值, * key=>value的形式组合:key表示栏目ID,value表示栏目名称 */ public static function dropDownList () { $query = static::find(); $enums = $query->all(); return $enums ? ArrayHelper::map($enums, 'id', 'name') : []; }
回到文章的表单界面(views\blog\_form.php),我们来构建下栏目字段
use common\models\Category; <?php $form = ActiveForm::begin(); ?> <?= $form->field($model, 'title')->textInput(['maxlength' => true]) ?> <?= $form->field($model, 'content')->textArea(['maxlength' => true, 'rows' => 10]) ?> <?= $form->field($model, 'is_delete')->dropDownList(Blog::dropDownList('is_delete')) ?> <?= $form->field($model, 'category')->label('栏目')->checkboxList(Category::dropDownList()) ?> <div class="form-group"> <?= Html::submitButton($model->isNewRecord ? '添加' : '更新', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> </div> <?php ActiveForm::end(); ?>
我们看到关于模型新增属性的使用并无特殊之处。
注意:这里的 Blog::dropDownList 方法需要自己手动构建,参考我们刚刚写的Category::dropDownList。
表单构建好之后,先不急着提交,我们来看另外一个问题,在 yii2 中如何使用事务?
通常情况下你可以参考下面这个样本。
$transaction = Yii::$app->db->begi
还有62%的精彩内容,购买继续阅读
- 评论区