@MarkLb

Как правильно перебрать в foreach() Yii2 данные с POST для организации мультизагрузки данных?

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

Решил, всё же, не использовать batchInsert(), а обойтись AR, но по итогу получаю ошибку:
Call to a member function isAttributeRequired() on a non-object


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

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

Реализовал код:
if($category->load(Yii::$app->request->post()) && $category->validate()){
            $services = Yii::$app->request->post('UserService');
            foreach ($services as $service){
                $new_service = new UserService();
                $new_service->user_id = Yii::$app->user->id;
                $new_service->service_id = $service['service_id'];
            }
        }


В $services содержится следующий массив:
array(3) {
  [0]=>
  array(1) {
    ["service_id"]=>
    string(1) "1"
  }
  [1]=>
  array(1) {
    ["service_id"]=>
    string(1) "1"
  }
  [2]=>
  array(1) {
    ["service_id"]=>
    string(1) "1"
  }
}
  • Вопрос задан
  • 229 просмотров
Пригласить эксперта
Ответы на вопрос 1
Lumore
@Lumore
Front-end developer
Попробуйте вывести полученные данные, затем преобразовать их в удобный массив и уже потом используйте его в foreach.

А еще лучше использовать Транзакции при создании модели:
public function serviceCreate()
{
    if (!$this->validate()) {
        return null;
    }

    $transaction = Yii::$app->db->beginTransaction();

    try {
        foreach ($services as $service){
             $new_service = new UserService();
             $new_service->user_id = Yii::$app->user->id;
             $new_service->service_id = $service['service_id'];
         }
        $transaction->commit();
        return true;
    } catch (\Exception $e) {
        $transaction->rollBack();
        throw $e;
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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