@MaikMain
Начинающий backend - developer

Yii2. Вывод данных из связанных таблиц?

Добрый день. Появилась проблема с выводом данных из связанных таблиц в форму.
MotoOption - Таблица с названиями опций
spoiler

public function rules()
    {
        return [
            [['name','moto_option_category_id'], 'required'],
            [['name'], 'string', 'max' => 100],
        ];
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getMotoOptionTypes()
    {
        return $this->hasMany(MotoOptionType::className(), ['moto_option_id' => 'moto_option_id']);
    }

    public function getMotoOptionValue()
    {
        return $this->hasMany(MotoOptionValue::className(), ['moto_option_id' => 'moto_option_id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getMotoOptionCategory()
    {
        return $this->hasOne(MotoOptionCategory::className(), ['moto_option_category_id' => 'moto_option_category_id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getMotorcycleOptionValue()
    {
        return $this->hasMany(MotorcycleOptionValue::className(), ['moto_option_id' => 'moto_option_id']);
    }
}


MotoOptionValue - таблица со значениями для опций
spoiler

public function rules()
    {
        return [
            [['moto_option_id', 'name'], 'required'],
            [['moto_option_id'], 'integer'],
            [['name'], 'string', 'max' => 100],
            [['moto_option_id'], 'exist', 'skipOnError' => true, 'targetClass' => MotoOption::className(), 'targetAttribute' => ['moto_option_id' => 'moto_option_id']],
        ];
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getMotoOption()
    {
        return $this->hasOne(MotoOption::className(), ['moto_option_id' => 'moto_option_id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getMotoOptionValue()
    {
        return $this->hasMany(MotorcycleOptionValue::className(), ['moto_option_value_id' => 'moto_option_value_id']);
    }
}


MotorcycleOptionValue - связующая таблица: мотоцикла, опций и значений опций
spoiler

/**
 * This is the model class for table "motorcycle_option_value".
 *
 * @property int $motorcycle_option_value_id
 * @property int $motorcycle_id
 * @property int $moto_option_id
 * @property int $moto_option_value_id
 *
 * @property Motorcycle $motorcycle
 * @property MotoOption $motoOption
 * @property MotoOptionValue $motoOptionValue
 */
class MotorcycleOptionValue extends \yii\db\ActiveRecord
{
    const SCENARIO_TABULATOR = 'tabular';

    public static function tableName()
    {
        return 'motorcycle_option_value';
    }

    public function rules()
    {
        return [
            [['motorcycle_id', 'moto_option_id'], 'required'],
            [['moto_option_value_id'], 'required', 'except' => self::SCENARIO_TABULATOR],
            [['motorcycle_id', 'moto_option_id', 'moto_option_value_id'], 'integer'],
            [['motorcycle_id'], 'exist', 'skipOnError' => true, 'targetClass' => Motorcycle::className(), 'targetAttribute' => ['motorcycle_id' => 'id']],
            [['moto_option_id'], 'exist', 'skipOnError' => true, 'targetClass' => MotoOption::className(), 'targetAttribute' => ['moto_option_id' => 'moto_option_id']],
        ];
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getMotorcycle()
    {
        return $this->hasOne(Motorcycle::className(), ['id' => 'motorcycle_id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getMotoOption()
    {
        return $this->hasOne(MotoOption::className(), ['moto_option_id' => 'moto_option_id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getMotoOptionValue()
    {
        return $this->hasOne(MotoOptionValue::className(), ['moto_option_value_id' => 'moto_option_value_id']);
    }
}


Motorcycle - таблица с мотоциклом (товаром)
spoiler

public function getMotorcycleOptionValue()
    {
        return $this->hasMany(MotorcycleOptionValue::className(), ['motorcycle_id' => 'id']);
    }



Во views/motorcycle/view.php вывожу (в phpMyAdmin напрямую добавил данные) связку данных. И здесь все правильно выводится:
spoiler

<div class="tab-pane" id="har">
                        <p><?= Html::a('Добавить значение', ['option/motorcycle-option-value/create', 'motorcycle_id' => $model->id], ['class' => 'btn btn-primary']); ?></p>
        <?= GridView::widget([
            'dataProvider' => new \yii\data\ActiveDataProvider(['query' => $model->getMotorcycleOptionValue()->with('motoOptionValue')]),
            'columns' => [
                ['class' => 'yii\grid\SerialColumn'],

                [
                    'attribute' => 'moto_option_id',
                    'value' => 'motoOption.name',
                ],
                [
                    'attribute' => 'moto_option_value_id',
                    'value' => 'motoOptionValue.name',
                ],
                [
                    'class' => 'yii\grid\ActionColumn',
                    'header' => 'Действие',
                    'controller' => '/option/motorcycle-option-value',
                ],
            ],
        ]); ?>
        </div>


Пытаюсь сделать в изменении мотоцикла, добавление новых опций. И вот здесь не правильно выводится.
MotorcycleController
spoiler

public function actionUpdate($id)
    {
        $model = $this->findModel($id);

        $values = $model->getMotorcycleOptionValue()->with('motoOptionValue')->indexBy('moto_option_id')->all();
        $options = MotoOption::find()->indexBy('moto_option_id')->all();

        foreach (array_diff_key($options, $values) as $option) {
            $values[] = new MotorcycleOptionValue(['moto_option_id' => $option->moto_option_id]);
        }

        foreach ($values as $value) {
            $value->setScenario(MotorcycleOptionValue::SCENARIO_TABULATOR);
        }

        $post = Yii::$app->request->post();

        if ($model->load($post) && $model->save() && Model::loadMultiple($values, $post)) {
            foreach ($values as $value) {
                if ($value->validate()) {
                    if (!empty($value->moto_option_value_id)) {
                        $value->motorcycle_id = $model->id;
                        $value->save();
                    } else {
                        $value->delete();
                    }
                }
            }
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('update', [
                'model' => $model,
                'values' => $values
            ]);
        }
    }


Либо я не правильно что-то написал в контроллере. Либо я что-то не правильно пишу в форме.
Форма:
spoiler

<div class="box-body">
            <div class="col-xs-4">
                foreach ($values as $value): ?>
                <?= $form->field($value, '[' . $value->motoOptionValue->moto_option_value_id . ']moto_option_value_id')->label($value->motoOptionValue->motoOption->name); ?>
                <?php endforeach; ?>
            </div>
        </div>



--------------------------
И еще как-то нужно в dropDownList вывести значения относящиеся именно к определенной (своей) опции.

Помогите пожалуйста. За ранее большое спасибо! =)
  • Вопрос задан
  • 137 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы