Yii2 多对多关系2

Yii2 多对多关系2,yii2,many-to-many,yii2-model,Yii2,Many To Many,Yii2 Model,我需要这个代码的帮助,我是Yii2的新手。 我正在构建一个示例项目开始,我不知道为什么我的代码得到了正确的结果,但没有将我需要的ID保存到关系的多对多表中。 我从wiki中的这个示例开始: 我的模型 public function rules() { return [ [['anno', 'durata', 'flagdelete', 'categoriaid'], 'integer'], [['titolo', 'riassunto', 'regista

我需要这个代码的帮助,我是Yii2的新手。 我正在构建一个示例项目开始,我不知道为什么我的代码得到了正确的结果,但没有将我需要的ID保存到关系的多对多表中。 我从wiki中的这个示例开始:

我的模型

public function rules()
{
    return [
        [['anno', 'durata', 'flagdelete', 'categoriaid'], 'integer'],
        [['titolo', 'riassunto', 'regista', 'descrizione'], 'string', 'max' => 50],
        [['attoriIds'], 'safe'],
    ];
}

public function attributeLabels()
{
    return [
        'titolo' => 'Titolo',
        'anno' => 'Anno',
        'durata' => 'Durata',
        'riassunto' => 'Riassunto',
        'regista' => 'Regista',
        'descrizione' => 'Descrizione',
        'categoriaid' => 'Categoria',
        'nome' => 'Attori',
    ];
}

/**
 * @var array
 */
public $attoriIds = [];

public function getdropAttori()
{
    $data = Attori::find()->asArray()->all();
    return ArrayHelper::map($data, 'id', 'nome');
}

/**
 * @return mixed
 */
public function getAttoriIds()
{
    return $this->attoriIds;
}

/**
 * @param $attoriIds
 */
public function setAttoriIds($attoriIds)
{
    $this->attoriIds = \yii\helpers\ArrayHelper::getColumn(
        $this->getAttdvd()->asArray()->all(),
        'attori_id'
    );
}

/**
 * @param $insert
 * @param $changedAttributes
 */
public function afterSave($insert, $changedAttributes)
{
    $actualAttoris = [];
    $attoriExists = 0;

    if (($actualAttoris = Attdvd::find()->andWhere(
        "dvd_id = $this->id"
    )->asArray()->all()) !== null
    ) {
        $actualAttoris = ArrayHelper::getColumn($actualAttoris, 'attori_id');
        $attoriExists = 1;
    }

    if (!empty($this->despIds)) {
        foreach ($this->despIds as $id) {
            $actualAttoris = array_diff($actualAttoris, [$id]);
            $r = new Attdvd();
            $r->dvd_id = $this->id;
            $r->attori_id = $id;
            $r->save();
        }
    }

    if ($attoriExists == 1) {
        foreach ($actualAttoris as $remove) {
            $r = Attdvd::findOne(
                ['attori_id' => $remove, 'dvd_id' => $this->id]
            );
            $r->delete();
        }
    }
    parent::afterSave($insert, $changedAttributes);
}

/**
 * @return mixed
 */
public function getAttdvd()
{
    return $this->hasMany(Attori::className(), ['id' => 'attori_id'])->viaTable(
        'attdvd', ['dvd_id' => 'id']
    );
}
我的控制器

public function actionCreate()
{
    $model = new Dvd();

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id]);
    }

    return $this->render('create', [
        'model' => $model,
    ]);

}

public function actionUpdate($id)
{
    $model = $this->findModel($id);
    //i think the problem is the line below
    $model->attoriIds = $model->AttoriIds;

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id]);
    }

    return $this->render('update', [
        'model' => $model,
    ]);
}
我的表格(工作正常):



这是一种糟糕的方式,因为在多个模型中生成代码会使模型更脏。更好的方法是使用通用组件来管理模型中的关系。例如

con您能简单地解释一下这个组件是如何工作的吗?除了github文档之外,没有其他在线文档或示例。你能做一个可能适合我的代码的例子吗?我用解决了,因为你链接的那个将很快被弃用,但经过大量的工作后,它工作了,非常感谢,而且非常容易使用!通常,指向工具或库的链接。
<?= $form->field($model, 'AttoriIds')->widget(Select2::classname(), ['data'=>$model->dropAttori, 'options' => ['multiple' => true, 'placeholder' => 'Seleziona attori']])->label('Attori') ?>