Обновить один столбец - PullRequest
       15

Обновить один столбец

0 голосов
/ 20 октября 2019

У меня есть таблица со столбцами id, technology и counter. Если данное значение равно значению столбца technology, строка должна быть обновлена. Т.е. значение counter (которое является целым числом) должно быть увеличено на 1. Если значение не существует в таблице, должна быть создана новая строка.

Это то, что я пробовал:

$technologiesOfficial = new TechnologiesOfficial();
$technology = $this->getDoctrine()->getRepository(TechnologiesOfficial::class)->findOneBy(array('technology' => $value));

if (!$technology) {
    $technologiesOfficial->setTechnology($value);
    $technologiesOfficial->setCounter(1);
}
else {
    $counter = $technology->getCounter() + 1;
    $technology->setTechnology($technology->getTechnology());
    $technology->setCounter($counter);
}
$this->em->persist($technologiesOfficial);
$this->em->flush();

Вот что я получаю:

Возникла исключительная ситуация при выполнении 'INSERT INTO technologies_official (technology, counter, Approved) VALUES (?,?,?)' Сparams [null, null, null]:

SQLSTATE [23000]: Нарушение ограничения целостности: 1048 Столбец «технология» не может быть пустым

Оператор if работает и новыйстрока будет создана, но часть else приносит проблему, даже если я попробую ее с $technology->setTechnology('hello');.

Ответы [ 2 ]

0 голосов
/ 20 октября 2019

Я нашел решение. Проблема была в параметре persist.

$technologiesOfficial = new TechnologiesOfficial();
$technology = $this->getDoctrine()->getRepository(TechnologiesOfficial::class)->findOneBy(array('technology' => $value));

if (!$technology) {
    $technologiesOfficial->setTechnology($value);
    $technologiesOfficial->setCounter(1);
    $object = $technologiesOfficial;
}
else {
    $technology->setCounter($technology->getCounter() + 1);
    $object = $technology;
}
$this->em->persist($object);
$this->em->flush();
0 голосов
/ 20 октября 2019

Мне непонятно, если я не увижу больше кода, чего ты пытаешься достичь, но эти строки:

$counter = $technology->getCounter() + 1;
$technology->setTechnology($technology->getTechnology());
$technology->setCounter($counter);

, похоже, мало что делают. Вы вызываете геттер и передаете его, не видимо, видоизменив объект. Похоже, что вы могли бы сделать то же самое с помощью этого:

$technology->setCounter($technology->getCounter() + 1);

Если у вас нет веских причин, setTechnology() не следует полагаться на getTechnology(), если значение getTechnology() не было изменено первым.

...