Yii2 - 使用连接表插入关系数据,许多连接

Ada*_*osi 6 yii2

我有Yii2(稳定)的问题.

我有一个Content(PK:id)表,我有一个Tag(PK:id)表,我有一个名为Content_Tag的连接表(PK:content_id,tag_id).我想用它来标记,就像WP标签一样.

所有控制器和模型都使用gii创建.

我有两个问题:

如果我创建一个新内容,我想通过Content_Tag表将一些新标签保存到Tag表.我怎样才能做到这一点?用link()?

如果标签表中有标签(我知道ID),我想通过联结表只与Content表连接,而不插入Tag表.我怎样才能做到这一点?

我不想编写本机SQL命令,我想使用Yii2内置函数,如link()或via()或viaTable().

谢谢你的帮助!

Rab*_*bib 0

如果您使用 gii 创建模型,那么您可能会在模型中看到这种关系,如下所示:

 /**
 * @return \yii\db\ActiveQuery
 */
public function getContent()
{
    return $this->hasMany(Content_Tag::className(), ['content_id' => 'id']);
}

/**
 * @return \yii\db\ActiveQuery
 */
public function getContent()
{
    return $this->hasMany(Tag::className(), ['tag_id' => 'tag_id'])->viaTable('content_tag', ['content_id' => 'id']);
}
Run Code Online (Sandbox Code Playgroud)

如果您想根据内容和标签表保存在 Content_Tag 表中,那么在控制器中您可以使用:

public function actionCreate()
  {
    $model          = new Tag();
    $content          = new Content();
    $content_tag = new Content_tag();

    if($model->load(Yii::$app->request->post()) && $model->save()){
      $model->save(false);
      $content_tag->tag_id = $model->id;
      $content_tag->content_id = $model->content_id;
      $content_tag->save(false);
      if($model->save(false))
      {
        Yii::$app->getSession()->setFlash('success', 'Created successfully');
        return $this->render('create',[
            'model' => $model,
            'content' => $content,
            'content_tag' => $content_tag
          ]);
      }
    }
    else
    {
      return $this->render('create', [
          'model' => $model,
        ]);
    }
  }
Run Code Online (Sandbox Code Playgroud)

您可以使用 link() 来保存。我也在寻找它,因为我没有使用它。