Laravel неправильно обновляет данные в БД

Вот код функции в моей модели:

public function updateAnime(Request $request)
{
    $updatedFields = [];

    $request->validate([
        'title' => ['required'],
        'release_date' => ['required', 'integer'],
        'author' => ['required'],
        'studio' => ['required'],
        'description' => ['required'],
    ]);

    $request->release_date = (int)$request->release_date;
    $animeInfo = Anime::where('title', $request->oldTitle)->with('authors', 'studios')->first();

    $author = Author::firstOrCreate(['author' => $request->author]);
    AuthorAnime::where([
        ['author', $animeInfo->authors[0]->author],
        ['anime', $request->oldTitle]
    ])->update([
        'author' => $author->author,
        'anime' => str_replace(' ', '-', $request->title)
    ]);

    $studio = Studio::firstOrCreate(['studio_name' => $request->studio]);
    StudioAnime::where([
        ['studio', $animeInfo->studios[0]->studio_name],
        ['anime', $request->oldTitle]
    ])->update([
        'studio' => $studio->studio_name,
        'anime' => str_replace(' ', '-', $request->title)
    ]);

    foreach ($request->all() as $key => $value) {
        if (property_exists($animeInfo, $key)) {
            if ($request->$key != $animeInfo->$key) {
                $updatedFields[$key] = $request->$key;
            }
        }
    }

    $animeInfo->update($updatedFields);
    return response()->json(['message' => 'Data was updated successfully. \n Updated data: ' . implode(', ', array_keys($updatedFields))]);
}

Код в контроллере:

        $anime = new Anime();
        return $anime->updateAnime($request);

Проблема в том, что он обновляет связанные таблицы StudioAnime и AuthorAnime, а также создает новые данные в таблицах Studio и Anime, но не обновляет таблицу Anime. Может кто-нибудь объяснить мне, почему это происходит и как это исправить, пожалуйста?

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

        $animeInfo->update([
            'title' => str_replace(' ', '-',$request->title),
            'poster' => $animeInfo->poster,
            'description' => $request->description,
            'release_date' => $request->release_date,
            'trailer' => $animeInfo->trailer,
        ]);
        return response()->json(['message' => 'Data was updated successuflly']);```

Вы установили свойство $fillable в модели аниме?

Pippo 01.08.2023 18:46

Да. $fillable = ['название', 'дата_релиза', 'описание', 'афиша', 'трейлер'];

user483882 01.08.2023 19:03

Вы отлаживали переменную $updatedFields после foreach ($request->all()...?

Pippo 01.08.2023 20:46

Да. Это пустой массив, но я не понимаю, почему. Возможно проблема в цикле foreach

user483882 01.08.2023 21:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете получить имена столбцов с помощью функции property_exist(), потому что атрибуты не доступны напрямую как свойства в объекте модели.

Чтобы проверить это, вы можете попробовать в tinker:

dd(User::first())

Я предлагаю вам использовать методы attributeToArray() или getAttributes() в сочетании с array_keys(), чтобы получить массив имен атрибутов модели:

$animeAttributes = array_keys($animeInfo->getAttributes());

foreach ($request->all() as $key => $value) {

    if (in_array($key, $animeAttributes)) {

    /* ... */

Большое спасибо! Теперь все работает

user483882 01.08.2023 23:09

Другие вопросы по теме