yii2项目实战-多表关联操作
更新于 2017年07月26日 by 白狼 被浏览了 3810 次
3 1

本来这一章节的标题是富文本编辑器和日期组件的使用,老朋友们应该都清楚,关于富文本和日期组件,前面我们有相关博客已经写的那是相当的明白,我是实在也写不出来新鲜的感觉了,现在一周写1-3篇文章也很赶,毕竟只是业余时间去写。

但是写文章的动力和激情那是磨灭不了的!好了,废话不多说了,我们这里贴一下富文本编辑器日期时间组件使用的链接,一路跟着实战的朋友可以去参考一下,有任何问题留言即可。

我们来看今天的重点:如何实现多表关联操作。

任务需求:

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

数据表的分析:

  1. 需要博客表 blog
  2. 需要栏目表 category
  3. 需要博客和栏目的关联表 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%的精彩内容,购买继续阅读