Пропустить объект, существующий в базе данных

У меня есть данные json, которые мне нужно импортировать в db. Мне нужно проверить два значения поля в базе данных перед сохранением объекта. Если они существуют, пропустить их, не выдавая ошибки, а если нет, то создать только недостающее.

        $file = file_get_contents('file.json');
        $jsonData = json_decode($file, true);

        $check = $this->getMyRepository()->findOneBy([
                'first_name' => $firstName,
                'last_name' => $lastName
            ]);

        foreach ($jsonData as $data) {

            if ($check) {
                continue;
            } else {
                $new = new MyEntity();
                $new->setFirstName($data->getFirstName());
                $new->setLastName($data->getLastName());
                $this->em->persist($new);
            }
        }
    }
    $this->em->flush();
}

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

Переместите этот вызов findOneBy в foreach, а $firstName $lastName замените на $data->getFirstName() и $data->getLastName()

LiTe 28.05.2019 15:39

Спасибо за повтор. Не будет работать, потому что вызов функции-члена getFirsName() для строки @LiTe

develops 28.05.2019 15:46

Давайте посмотрим пример вашего файла json, пожалуйста

RiggsFolly 28.05.2019 15:48

@develops Так что это также не может работать при настройке вашей сущности.

LiTe 28.05.2019 15:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
2
4
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

По сути, вы преобразуете файл json в массив, поэтому вам нужно обратиться к $data как к массиву, чтобы получить его значения.

Код, который проверяет, существует ли этот человек, должен быть внутри цикла, так как вы хотите проверять каждого человека при обработке набора людей в файле json.

Now we know that your JSON File is really not helping and does not really deserve the name JSON.....

Пример файла

{ "John Doe": "John Doe", "Jane Doe": "Jane Doe" }

Код должен быть

        $file = file_get_contents('file.json');
        $jsonData = json_decode($file, true);


        foreach ($jsonData as $data) {
             // Split the single field into Firstname and lastname
            $name = explode(' ', $data);

            $exists = $this->getMyRepository()->findOneBy([
                                'first_name' => $name[0],
                                'last_name' => $name[1]
                            ]);

            if ($exists) { 
                // this person already in the database
                // thats cool, just dont try and insert them again
                continue;
            } else {

                // again in here you are getting data from an array 
                // called `$data` and not an entity with getters and setters
                $new = new MyEntity();
                $new->setFirstName($name[0]);
                $new->setLastName($name[1]);
                $this->em->persist($new);
            }
        }
    }
    $this->em->flush();
}

Big Warning This code relies on the JSON Data file ALWAYS having a first name and a lastname seperated by a space. THIS IS A VERY A DANGEROUS THING TO RELY UPON

You should really go back to the person that created this JSON file and ask then to do it properly!!!

Большое спасибо, но моя проблема в том, что в моем json у меня есть только список имен, таких как массив: 97 [ "Джон Доу" => "Джон Доу" "Джейн Доу" => "Джейн Доу"] @RiggsFolly

develops 28.05.2019 16:04

Пожалуйста, не могли бы вы показать нам небольшой образец реального файла json

RiggsFolly 28.05.2019 16:05

Это часть моего файла json, которую я представил в комментарии выше. @RiggsFolly

develops 28.05.2019 16:07

{ "Джон Доу": "Джон Доу", "Джейн Доу": "Джейн Доу" } извините, я скопировал выгруженные результаты. @RiggsFolly

develops 28.05.2019 16:09

Есть ли у вас какой-либо контроль над созданием этого файла. Потому что это довольно ужасная структура данных json?

RiggsFolly 28.05.2019 16:14

Это файл, который я получил. Так что боюсь нет. Есть ли какое-нибудь решение для этого? @RiggsFolly

develops 28.05.2019 16:17

@develops В своем вопросе вы сказали, что импорт работает, за исключением фильтра дубликатов. Если ваш файл json действительно такой, как вы разместили в комментариях, ваш импорт не может работать и должен выдавать ошибки типа «неизвестный индекс».

Cerad 28.05.2019 16:21

Я устанавливаю только setName(), а не firstName, lastName. Это вторая часть. И импорт работает нормально. Просто, когда я снова запускаю, он снова импортирует все имена. Это проблема. И я хочу проверить, есть ли они уже в базе данных. Я изменил всю логику, чтобы я мог разобраться. Взгляните на мой реальный код здесь. Спасибо. stackoverflow.com/questions/56340135/… @ Серад @RiggsFolly

develops 28.05.2019 16:24

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