yii2项目实战-多表关联操作
更新于 2016年11月13日 by 白狼 被浏览了 779 次

本来这一章节的标题是富文本编辑器和日期组件的使用,老朋友们应该都清楚,关于富文本和日期组件,前面我们有相关博客已经写的那是相当的明白,我是实在也写不出来新鲜的感觉了,现在一周写1-3篇博客也累。但是写文章的动力和激情那是磨灭不了的!好了,废话不多说,我们这里贴一下富文本编辑器日期时间组件使用的链接,一路跟着实战的朋友可以去参考一下,有任何问题留言即可。我们这里来讲述下本篇文章的主题:如何实现多表关联操作。

先来看一个问题:何为批量插入呢?我不说你也明白。下面我们简短的描述一下我们这节的任务需求:

比如说我们要创建博客,在创建博客的表单页面,要同时选择相应的栏目。且博客跟栏目是一对多的关系,也就是说创建博客的时候要选择多个所属栏目。

通常对于一个需求,我们拿来那自然是要先分析如何实现是好。先来看数据表的分析:

  1. 需要博客表 blog
  2. 需要栏目表 category
  3. 需要博客和栏目的关联表 blog_category

很显然,一篇博客可以对应多个栏目,而一个栏目也对应着多篇博客。即二者之间是多对多的关系。

我们在modal初识这篇文章中结束之前,三张数据表都已经创建好了,这里就不再重复创建了。

来看具体实现:

先看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 的使用,需要提醒的是,该工具类的使用日后那绝对是非常普遍的。这里不再说明map的用法,可手动打印dropDownList方法的返回值自行体会,亦可自己去研究下源码哦。

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(); ?>

我们注意到关于模型新增属性的使用并无特殊之处。

表单构建好之后,我们先来看下yii2中事务是如何使用的:

$transaction = Yii::$app->db->beginTransaction();
try {
    // current model save
    // batch insert category
    // 提交
    $transaction->commit();
} catch (Exception $e) {
    // 回滚
    $transaction->rollback();
    // 抛出异常
    throw $e;
}

剩下的就是事务中涉及到业务逻辑代码的实现了,来看下controller层具体又是如何实现的

继续阅读

还有62%的精彩内容,购买继续阅读