slo_nik
@slo_nik

Исправить ошибку Call to a member function isAttributeRequired() on array?

Добрый вечер.
При обновлении модели, для dropDownList() возникает ошибка
Call to a member function isAttributeRequired() on array
.
dropDownList имеет параметр multiple. Данные в списке получаю через связанную таблицу, в которой есть id продукта и id категории.
Метод, результат работы которого пытаюсь впихнуть в список
protected function findCategoriesModel($id)
    {
        if(($model = ProductsCategories::find()->where('product_id=:id',[':id' => $id])->all()) !== null){
            return $model;
        }
    }

Если заменить в запросе all() на one(), то ошибка уходит, но выводится одно значение сохранённое в базе. Но значений в базе может быть много.
Так же в модели Products есть связь на модель категорий
public function getAssociatedProducts()
    {
        return $this->hasMany(Catalog::className(), ['id' => 'associated_id'])->viaTable('{{%products_associated}}', ['product_id' => 'id']);
    }

Подскажите, как правильно сделать? Никак не могу сообразить.
  • Вопрос задан
  • 3717 просмотров
Решения вопроса 1
slo_nik
@slo_nik Автор вопроса, куратор тега Yii
Ответ, как всегда, оказался проще простого.
Создаём в модели геттер
public function getAssociatedArray()
{
    return $this->getAssociatedProducts()->select('id')->column();
}

На выходе получаем массив с нужными id, все категории, которые привязаны к продукту, ну или наоборот, все категории, к которым привязан продукт.
Теперь в форме этот геттер можно использовать так:
<?= $form->field($model, 'associatedArray')->dropDownList(Catalog::getChildCategoryList(),
            [
                'multiple' => true,
                'class' => 'select-multiple',
                'style' => 'width:100%;',
            ])
        ?>

При создании новой записи мы получим все категории, из которых можно выбрать несколько для продукта.
При обновлении записи мы получим все категории, к которым привязан продукт.

p.s. Это только малая часть кода, которая не даёт возникать ошибке
Call to a member function isAttributeRequired() on array

Для того, чтобы сохранить данные в базе - надо расширять данный код, дописывать функционал.

p.s.s Ответ подсмотрел у одного хорошего человека)))
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы