У меня есть данные 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, он всегда импортирует все значения, а этого не должно быть, как я уже говорил.
Спасибо за повтор. Не будет работать, потому что вызов функции-члена getFirsName() для строки @LiTe
Давайте посмотрим пример вашего файла json, пожалуйста
@develops Так что это также не может работать при настройке вашей сущности.
Пожалуйста, смотрите комментарии в коде, чтобы узнать, что изменилось и почему.
По сути, вы преобразуете файл 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
Пожалуйста, не могли бы вы показать нам небольшой образец реального файла json
Это часть моего файла json, которую я представил в комментарии выше. @RiggsFolly
{ "Джон Доу": "Джон Доу", "Джейн Доу": "Джейн Доу" } извините, я скопировал выгруженные результаты. @RiggsFolly
Есть ли у вас какой-либо контроль над созданием этого файла. Потому что это довольно ужасная структура данных json?
Это файл, который я получил. Так что боюсь нет. Есть ли какое-нибудь решение для этого? @RiggsFolly
@develops В своем вопросе вы сказали, что импорт работает, за исключением фильтра дубликатов. Если ваш файл json действительно такой, как вы разместили в комментариях, ваш импорт не может работать и должен выдавать ошибки типа «неизвестный индекс».
Я устанавливаю только setName(), а не firstName, lastName. Это вторая часть. И импорт работает нормально. Просто, когда я снова запускаю, он снова импортирует все имена. Это проблема. И я хочу проверить, есть ли они уже в базе данных. Я изменил всю логику, чтобы я мог разобраться. Взгляните на мой реальный код здесь. Спасибо. stackoverflow.com/questions/56340135/… @ Серад @RiggsFolly
Переместите этот вызов findOneBy в foreach, а $firstName $lastName замените на $data->getFirstName() и $data->getLastName()