Сохранение имени картинки в базе данных

270
31 декабря 2018, 10:30

yii2-advanced, сохраняю и записываю картинку к записи в бд.

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

Вопрос: можно ли так делать и делают ли так вообще?

public function saveCategory()
{
    $this->image_url = UploadedFile::getInstance($this, 'image_url');
    $dir = "uploads/categories";
    if ($this->image_url && $this->validate()) {
        $image_url = $this->image_url;
        if ($this->save()) {
            $name = "$this->id.$image_url->extension";
            $this->image_url = $name;
            $this->save();
            $image_url->saveAs("$dir/$name");
        }
    }
    else {
        $model = Categories::findOne($this->id);
        if ($model->image_url) {
            $this->image_url = $model->image_url;
        }
        $this->save();
    }
    return true;
}

Конкретно вот это место:

        if ($this->save()) {
            $name = "$this->id.$image_url->extension";
            $this->image_url = $name;
            $this->save();
            $image_url->saveAs("$dir/$name");
        }
Answer 1

(ответ из комментария)

Сначала сохраняете основную модель, если модель сохранена, получаете ее id. Потом уже сохраняете картинку с полученным id. Больше никак.

Answer 2

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

Метод saveCategory() для чего написан? Метод ради метода? Категория и картинка это разные сущности и их надо хранить в разных таблицах. У категории есть id, name, parent и все, остальные данные (какие бы они не были) к сущности категория не относятся. За уши можно притащить что угодно, но это добавит только ужаса в код.

В данном случае я бы рекомендовал использовать две разные таблицы, а логику сохранения можно и нужно описать в behavior. Используя событие afterSave сохранить картинку и связать две эти сущности (категорию и картинку) через промежуточную таблицу. Получать данные картинки необходимо через реляцию с использованием метода via() или метода viaTable(). Методы для получения с использованием промежуточной таблицы.

Таким образом получится чистая и аккуратная категория, чистая аккуратная картинка. Бихевиор можно прицепить к другой сущности (например раздел) и не будет необходимости писать еще один метод с корявой логикой сохранения и кучей ифов.

Рекомендую изучить или хотя бы познакомиться с принципами SOLID

READ ALSO
Не могу вывести пагинацию WordPress

Не могу вывести пагинацию WordPress

Я создал страницу новостей, как обычную страницу с помощью шаблона

180
Как зашифровать числа [закрыт]

Как зашифровать числа [закрыт]

Как зашифровать числа например, 1 или 2 было как dFf3 с помощью PHP? нужно зашифровать id пользователя с возможностью расшифровки!

173
Поправить условие на php

Поправить условие на php

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

165
Отправка запроса curl

Отправка запроса curl

Данный код не отрабатывает, но при использовании программы soupUI и установке Post QueryString все отрабатываетНе могу понять в чем проблема

167