SQL update symfony

0

Chcę zrobić licznik odwiedzin każdego artykułu. Mam w bazie w tabeli pole które przechowuje te wartości i chciałbym je inkrementować po każdym wejściu. Próbowałem tak

/**
     * @Route("/artykul/{id}", name="show")
     */
    public function show($id,InformationsRepository $informationsRepository)
    {
       $em = $this->getDoctrine()->getManager();
    $articl = $em->getRepository(Informations::class)->find($id);
    $author = $em->getRepository(User::class)->findBy(
            array(),array('id' => 'DESC'));


    $query=$em->createQuery(
            'SELECT u.email FROM  App\Entity\Informations i join App\Entity\User u with i.author=u.id and i.id='.$id
            );
    $query2=$em->createQuery(
            "UPDATE   App\Entity\Informations i SET i.viewsCounter=(SELECT u.viewsCounter FROM  App\Entity\Informations j where j.id=$id)+1 where i.id='.$id"
            );


    $result=$query->getSingleResult();


    $statement = $em->getConnection()->prepare($query2);
        $statement->execute();

        $result3 = $statement->fetchAll();


    if (!$articl) {
        throw $this->createNotFoundException(
            'No product found for id '.$id
        );
    }
    return $this->render('miasta/show.html.twig', [
        'dane' => $articl,
       'autor'=>$result]
            );
    }

ale mam błąd

Catchable Fatal Error: Object of class Doctrine\ORM\Query could not be converted to string

Znalazłęm informacje że trzeba dodać funkcję toString i dodałem ale nadal ten sam błąd

0

Pierwsze primo: wystarczy UPDATE tabela SET kolumna = kolumna + 1;.
Drugie primo: dlaczego klepiesz te zapytania ręcznie?

0

W jaki inny sposób miałbym to zrobić? Użyć setterów z encji?

0

No tak :-P

Takie zapytanie też ma oczywiście sens (jest atomowe - w porównaniu do wykorzystania setterów), lecz do czegoś w ramach nauki jak najbardziej wystarczy.

0

Tak to powinno wyglądać czy te funkcje jakoś inaczej wywołąć?

Informations::setViewsCounter(Informations::getViewsCounter+1);

ale wtedy jest błąd

Using $this when not in object context

czy utworzyć instancje klasy?

0

Zrobiłem tak

$i=new Informations();
   $i->setViewsCounter($i->getViewsCounter()+1);

ale nic nie zmienia w bazie

0

A robisz chociaż persist() na tej encji? Tzn na entity managerze robisz persist i flush. Poczytaj o tym jak korzystać z entity managera w doctrine
https://symfony.com/doc/current/doctrine.html#persisting-objects-to-the-database

0

Dodałem to persist i już się aktualizuje baza, ale po jednym odświeżeniu losowo zwiększa się o kilka a nie o jeden, a po kilkunastu sekundach to nawet o kilkanaście

1 użytkowników online, w tym zalogowanych: 0, gości: 1