WebHU - Programozási kérdések és válaszok

Hiba történt az adatok beszúrása során a Yii2 több táblájába

Amikor megpróbálok adatokat megjeleníteni egy kapcsolódó táblából, Call to a member function isAttributeRequired() on null hibaüzenetet kapok.

Vannak tábláim: PromoCode, SubscribePrice és PromoToSubscribePrice. De amikor megpróbálom megjeleníteni a Sub táblázatot a promóciós kódban, hibát kapok.

A következő linkre van szükségem: Egy PromoCode tábla létrehozásakor egy SubscribePrice táblából tudtunk adatokat kiválasztani (select2), és az ott kiválasztottakat csak a SubscribeToPromoCode táblában tároltuk.

Jelenleg, amikor megpróbálok átadni egy attribútumot, NULL értéket kapok

Sok-sok kapcsolatom van minden táblában

Modell: PromoCode

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

Vezérlő: 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,
        ]);
    }
}

és view:

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

Eredmény: Hiba: Egy tag függvény hívása isAttributeRequired() nullán.

Mit csinálok rosszul?

Napló:

Error: Call to a member function isAttributeRequired() on null in C:\program1\OpenServer\OSPanel\domains\masterRoom\master\vendor\yiisoft\yii2\widgets\ActiveField.php:859
Stack trace:
#0 C:\program1\OpenServer\OSPanel\domains\masterRoom\master\vendor\yiisoft\yii2\widgets\ActiveField.php(720): yii\widgets\ActiveField->addAriaAttributes(Array)
#1 C:\program1\OpenServer\OSPanel\domains\masterRoom\master\backend\views\promo-code\_form.php(36): yii\widgets\ActiveField->widget('kartik\\widgets\\...', Array)
 #2 C:\program1\OpenServer\OSPanel\domains\masterRoom\master\vendor\yiisoft\yii2\base\View.php(328): require('C:\\program1\\Ope...')
#3 C:\program1\OpenServer\OSPanel\domains\masterRoom\master\vendor\yiisoft\yii2\base\View.php(250): yii\base\View->renderPhpFile('C:\\program1\\Ope...', Array)
#4 C:\program1\OpenServer\OSPanel\domains\masterRoom\master\vendor\yiisoft\yii2\base\View.php(152): yii\base\View->renderFile('C:\\program1\\Ope...', Array, NULL)
#5 C:\program1\OpenServer\OSPanel\domains\masterRoom\master\backend\views\promo-code\create.php(18): yii\base\View->render('_form', Array)
#6 C:\program1\OpenServer\OSPanel\domains\masterRoom\master\vendor\yiisoft\yii2\base\View.php(328): require('C:\\program1\\Ope...')
#7 C:\program1\OpenServer\OSPanel\domains\masterRoom\master\vendor\yiisoft\yii2\base\View.php(250): yii\base\View->renderPhpFile('C:\\program1\\Ope...', Array)
#8 C:\program1\OpenServer\OSPanel\domains\masterRoom\master\vendor\yiisoft\yii2\base\View.php(152): yii\base\View->renderFile('C:\\program1\\Ope...', Array, Object(backend\controllers\PromoCodeController))
#9 C:\program1\OpenServer\OSPanel\domains\masterRoom\master\vendor\yiisoft\yii2\base\Controller.php(381): yii\base\View->render('create', Array, Object(backend\controllers\PromoCodeController))
#10 C:\program1\OpenServer\OSPanel\domains\masterRoom\master\backend\controllers\PromoCodeController.php(82): yii\base\Controller->render('create', Array)
#11 [internal function]: backend\controllers\PromoCodeController->actionCreate()
#12 C:\program1\OpenServer\OSPanel\domains\masterRoom\master\vendor\yiisoft\yii2\base\InlineAction.php(57): call_user_func_array(Array, Array)
#13 C:\program1\OpenServer\OSPanel\domains\masterRoom\master\vendor\yiisoft\yii2\base\Controller.php(156): yii\base\InlineAction->runWithParams(Array)
#14 C:\program1\OpenServer\OSPanel\domains\masterRoom\master\vendor\yiisoft\yii2\base\Module.php(523): yii\base\Controller->runAction('create', Array)
#15 C:\program1\OpenServer\OSPanel\domains\masterRoom\master\vendor\yiisoft\yii2\web\Application.php(102): yii\base\Module->runAction('promo-code/crea...', Array)
#16 C:\program1\OpenServer\OSPanel\domains\masterRoom\master\vendor\yiisoft\yii2\base\Application.php(380): yii\web\Application->handleRequest(Object(yii\web\Request))
#17 C:\program1\OpenServer\OSPanel\domains\masterRoom\master\backend\web\index.php(19): yii\base\Application->run()
#18 {main}
22.01.2019

Válaszok:


1

Frissítés

A korábban azonosított problémán kívül ugyanaz a hiba van a Select2 data opciójában

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

ott is átadja a ActiveRecord példányt, míg egy name=>value páros tömböt kell átadnia

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

A ArrayHelper::map() használatával az oszlopok kibontása asszociatív tömbként és listázása a select2-ben.


A problémád itt van a actionCreate() második sorában

$price = SubscribePrice::find();

mivel a $price tartalmazza az ActiveRecord példányt és nem a model példányt, és a $price ebben a sorban promo néven kerül átadásra a nézetnek

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

amelyet tovább használnak az ActiveForm <?= $form->field($promo, 'description')->widget(Select2::className(), [ mezőpopulációjában, míg a mező feltöltéséhez modellpéldányra van szükség, nem a ActiveQuery-re, ezért módosítsa erre.

$price = new SubscribePrice();

or

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

amelyik megfelel az Ön igényeinek.

22.01.2019
  • A probléma az, hogy már kipróbáltam ezt a lehetőséget, de az eredmény pontosan ugyanaz 24.01.2019
  • @Sergej Alig hiszem el, kérlek add hozzá a teljes hibanyomot. 24.01.2019
  • @Sergej neked is megvan a SubscribePrice::find()->orderBy('currency') sor, ami hibás a data opcióhoz egy tömb kell, nem a ActiveRecord példánya, lásd a frissítési részt a válaszomban. 24.01.2019
  • Az eredmény ugyanaz marad. És frissítettem a kérdést (napló hozzáadva) 24.01.2019
  • ellenőrizheti a var_dump($price) használatával, hogy megvan-e a modellpéldány, mielőtt felhívná a $this->render() @Sergej 24.01.2019
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..