Попытка понять model :: make () x model :: create () - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь понять разницу между следующим кодом:

Image::make(['path' => $path]);

и

Image:create(['path' => $path]);

Отношения

//Image Model
    /**
     * @return MorphTo
     */
    public function imageable(): MorphTo
    {
        return $this->morphTo();
    }
//Post Model
    /**
     * @return MorphOne
     */
    public function image(): MorphOne
    {
        return $this->morphOne(Image::class, 'imageable');
    }

Итак, я провел исследование и нашел объяснение производителя и изготовителя в разделе Factory. Казалось бы, make() создает экземпляр объекта, не сохраняя его. create() создает и сохраняет объект сразу.

Как работает код в примере?

Выше приведен полный фрагмент кода. На этом этапе код не работает должным образом.

$post->image()->save(
                Image::create([
                    'path' => $path,
                ])
            );

Он выдает исключение:

SQLSTATE[HY000]: General error: 1364 Field 'imageable_type' doesn't have a default value (SQL: insert into `images` (`path`, `updated_at`, `created_at`) values (thumbnails/RYBkyxFLNzxwbI5eTnzx2w4QqzOfRAUj7h2SgXQM.jpeg, 2020-04-12 15:41:05, 2020-04-12 15:41:05))

Теперь, используя make(), он работает. Без необходимости вручную добавлять imageable_type и imeageble_id. Но почему? Это я не могу понять.

$post->image()->save(
                Image::make(['path' => $path])
            );

1 Ответ

0 голосов
/ 12 апреля 2020

Вы правы, Factory make() создаст экземпляр Eloquent Model, не сохраняя его в базе данных. Который, если ваше модульное тестирование или вам не нужно попадать в базу данных, вам не нужно.

create() сохранит это в базе данных, чтобы его можно было извлечь из базы данных во время test.

Они могут использоваться только с $image = factory(Image::class)->make() или $image = factory(Image::class)->create(). Не пытайтесь использовать их в контроллере.

Измените ваш контроллер на:

$post->image()->save(['path' => $path]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...