Yii2-插入带有连接表的关系数据,多个连接

Yii2-插入带有连接表的关系数据,多个连接,yii2,Yii2,我对Yii2(稳定)有问题 我有一个Content(PK:id)表,一个Tag(PK:id)表,还有一个名为Content\u-Tag(PK:Content\u-id,Tag\u-id)的连接表。我想用它来做标签,比如WP标签 所有控制器和模型均使用gii创建 我有两个问题: 如果我创建了一个新的内容,我想通过content_标签表将一些新标签保存到标签表中。我该怎么做?使用link() 如果标签表中有标签(我知道ID),我只想通过连接表与内容表连接,而不想插入标签表。我该怎么做 我不想编写本机

我对Yii2(稳定)有问题

我有一个Content(PK:id)表,一个Tag(PK:id)表,还有一个名为Content\u-Tag(PK:Content\u-id,Tag\u-id)的连接表。我想用它来做标签,比如WP标签

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

我有两个问题:

如果我创建了一个新的内容,我想通过content_标签表将一些新标签保存到标签表中。我该怎么做?使用link()

如果标签表中有标签(我知道ID),我只想通过连接表与内容表连接,而不想插入标签表。我该怎么做

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


谢谢你的帮助

如果您使用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']);
}
如果要基于内容和标记表保存在内容\标记表中,则在控制器中可以使用:

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,
        ]);
    }
  }

可以使用link()保存。我也在搜索它,因为我没有使用它。

我创建了一个行为来帮助处理这个问题,基本上你是这样做的:

$content = Content::findOne(1);
$tags = [Tag::findOne(2), Tag::findOne(3)];
$content->linkAll('tags', $tags, [], true, true);
您可以在此处获得行为:

如果您希望在没有行为的情况下执行此操作,请执行以下操作:

// get the content model
$content = Content::findOne(1);
// get the new tags
$newTags = [Tag::findOne(2), Tag::findOne(3)];
// get the IDs of the new tags
$newTagIds = ArrayHelper::map($newTags, 'id', 'id');
// get the old tags
$oldTags = $post->tags;
// get the IDs of the old tags
$oldTagIds = ArrayHelper::map($oldTags, 'id', 'id');
// remove old tags
foreach ($oldTags as $oldTag) {
    if (!in_array($oldTag->id, $newTagIds)) {
        $content->unlink('tags', $oldTag, true);
    }
}
// add new tags
foreach ($newTags as $newTag) {
    if (!in_array($newTag->id, $oldTagIds)) {
        $content->link('tags', $newTag);
    }
}
你可以看看这里: