Ответы пользователя по тегу Yii
  • Yii2 3 таблицы и 2 ActiveRecord?

    tkutru
    @tkutru
    A programming cat.
    Насколько понял из вопроса, у вас связь многие-ко-многим.
    Если так, viaTable в помощь
    www.yiiframework.com/doc-2.0/yii-db-activequery.ht...
    Ответ написан
  • Загрузка файла и ActiveRecord - как? А именно, как сначала сделать saveAs файла, затем model->save?

    tkutru
    @tkutru
    A programming cat.
    Есть три основных варианта.
    1. Правильный: Соблюдать принцип единственной ответственности.
    Т.е. если есть какая-то модель и к ней можно дополнительно прикреплять картинки, то заведите отдельный класс для формы загрузки, в ее свойствах можно отдельно указать набор свойств для модели и отдельно - загружаемые файлы.
    Собственно в правилах валидации формы проверять файлы на соответствие форматам. При сохранении формы отдельно валидируйте-сохраняйте файл(ы), и отдельно - модель.
    www.yiiframework.com/doc-2.0/guide-input-file-uplo...
    Если файлы станут самостоятельной сущностью - заведите для них отдельную AR модель.

    2. Менее правильный: исправить ошибку в текущем решении.
    Проблема в том, что ваш метод uploadMyFiles вызывается до валидатора. Соответственно, можете вызывать его не в контроллере, а в методе модели afterValidate (он будет вызываться перед сохранением модели и после прохождения всех валидаций).

    3. Прочие способы (наименее предпочтительно).
    В валидаторе file можно задать сценарий при котором он (не) будет отрабатывать, после загрузки - менять сценарий на тот, при котором валидатор не работает. Другой вариант - использовать готовые решения. Еще один вариант - заменить валидатор на кастомный, который будет проверять файл на соответствие форматам и вызывать последующую загрузку.
    Ответ написан
  • Yii2 REST: Как правильно обработать post-запрос, в котором передается json-коллекция?

    tkutru
    @tkutru
    A programming cat.
    Получаете post данные, декодируете их в массив, траверсите массив и грузите данные в модели и сохраняете их. Допустим вы передаете данные в post параметре arr а модель у вас называется Model
    $data = json_decode(\Yii::$app->request->post('arr'), true);
    foreach ($data as $chunk) {
        $model = new Model();
        $model->attributes = $chunk;
        $model->save();
    }

    Чтобы модель корректно сохранилась в бд нужно чтобы ее свойства удовлетворяли ее правилам валидации (см. метод rules в классе модели). Если не сохраняется в бд, можно проверять на ошибки, например вместо обычного сохранения прописывать
    if (!$model->save()) {
        var_dump(['erorrs' => $model->errors]);
    }

    Ошибки выводятся в STDOUT просто для наглядности примера, вообще конечно их лучше не выводить сразу а логировать куда-то или оформлять в нормальный api ответ запрашивающему.
    Ответ написан
    Комментировать