尝试将数据插入Yii2中的多个表时出错

时间:2019-01-22 07:09:37

标签: yii2 yii2-advanced-app

当我尝试显示相关表中的数据时,出现错误Call to a member function isAttributeRequired() on null

我有以下表格:PromoCodeSubscribePricePromoToSubscribePrice。 但是,当我尝试在促销代码中显示表格Sub时,出现错误。

我需要以下链接:创建表PromoCode时,我们可以从表SubscribePrice中选择数据(select2),而我们选择的内容仅存储在表{{ 1}}。

当前,当我尝试传递属性时,我得到NULL

我在所有表中都有许多连接

型号:SubscribeToPromoCode

PromoCode

控制器:public function getPromoToSubscribePrice() { return $this->hasMany(SubscribePrice::class, ['id' => 'id']) ->viaTable('promo_to_subscribe_price', ['promo_id' => 'id']); }

PromoCodeController

public function actionCreate() { $model = new PromoCode(); $price = SubscribePrice::find(); $PromoToSubscribePrice = new PromoToSubscribePrice(); $PromoToSubscribePrice->promo_id = $model->id; $PromoToSubscribePrice->price_id = $model->article_id; $PromoToSubscribePrice->setAttributes(Yii::$app->request->post()); if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $model->id]); } else { return $this->render('create', [ 'model' => $model, 'promo' => $price, ]); } }

view

结果:错误:在null上调用成员函数isAttributeRequired()。

我在做什么错了?

日志:

<?= $form->field($promo, 'description')->widget(Select2::className(), [
    'data' => SubscribePrice::find()->orderBy('currency'),
    'options' => [
        'placeholder' => 'Select contributors ...',
        'multiple' => true
    ],
    'pluginOptions' => [
        'allowClear' => true
    ],
]); ?>

1 个答案:

答案 0 :(得分:1)

更新

除了先前发现的问题之外,您在Select2的{​​{1}}选项中也遇到了相同的错误

'data' => SubscribePrice::find()->orderBy('currency'),

您也在那里传递了ActiveRecord实例,而您需要传递带有name=>value对的数组,它应该是

'data' => \yii\helpers\ArrayHelper::map(SubscribePrice::find()->orderBy('currency')->all(),'id','currency')

使用ArrayHelper::map()将列提取为关联数组并将其列出在select2中。


您的问题在actionCreate()的第二行中

$price = SubscribePrice::find();

由于$price持有ActiveRecord实例而不是model实例,并且$price在这一行中以promo的形式传递给视图

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

在ActiveForm字段填充<?= $form->field($promo, 'description')->widget(Select2::className(), [中进一步使用,而在填充字段时,您需要模型实例而不是ActiveQuery,因此将其更改为。

$price = new SubscribePrice();

$price = SubscribePrice::find()->where(['column'=>$value])->limit(1)->one();

满足您要求的那个。