Много ко многим отношениям Yii2 - PullRequest
0 голосов
/ 10 декабря 2018

Мне нужна помощь с этим кодом, я новичок в Yii2.Я строю пример проекта, чтобы начать, и я не знаю, почему мой код дает правильный результат, но не сохраняет нужные мне идентификаторы в таблицу «многие ко многим» для отношений.Я начал с этого примера в вики: https://www.yiiframework.com/wiki/708/book-has-author-many-to-many-relations-using-kartikselect2

Моя модель

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

Моя форма (работает правильно):

<?= $form->field($model, 'AttoriIds')->widget(Select2::classname(), ['data'=>$model->dropAttori, 'options' => ['multiple' => true, 'placeholder' => 'Seleziona attori']])->label('Attori') ?>

1 Ответ

0 голосов
/ 10 декабря 2018

Это плохой способ, потому что создание этого кода в нескольких моделях сделает модели более грязными.Лучшим способом является использование универсального компонента, который может управлять отношениями в ваших моделях.Например, yii2-многие-ко-многим-поведение

...