2017-07-07 18 views
1

I'm新的Symfony和PostgreSQL和我正嘗試保存日誌數據庫更新/刪除 從來就創造了這個表Symfony3保存每次更新到數據庫

CREATE TABLE "public"."changes" (
    "id" INT NOT NULL , 
    "id_user" INT NOT NULL, 
    "operation" VARCHAR(45) NOT NULL, 
    "table" VARCHAR(45) NOT NULL, 
    "column" VARCHAR(45) NOT NULL, 
    "old_data" TEXT NOT NULL, 
    "new_data" TEXT NOT NULL, 
    "ts" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY ("id"), 
    CONSTRAINT "user" 
    FOREIGN KEY ("id_user") 
    REFERENCES "public"."users" ("id") 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION); 

而我需要的是保存到這個表,每次我sumething像

/** 
* @Route("/insert", name="insert") 
*/ 
public function insertAction(Request $request) 
{ 
    $em = $this->get('doctrine')->getManager(); 

    $info = new Info(); 
    $info->setMail($request->request->get('mail')); 
    $info->setName($request->request->get('name')); 
    $info->setLastname($request->request->get('lastname')); 

    $em->persist($info); 

    $em->flush(); 

} 

I'm思考與表/列/數據和沖洗後,如果一切正常的創建對象/數組,調用全局函數添加數據放入更改表中。 有沒有一種簡單的方法/好做法來做到這一點?

+0

你不能只是做一個postUpdate監聽器嗎? –

+0

如何?我在數據庫中創建了一個存儲過程,但是我還需要從代碼中創建這個過程,因爲我需要保存正在進行更改的用戶 –

+1

我們通過使用Postgres的['LISTEN'](https:// www .postgresql.org/docs/current/static/sql-listen.html)&['NOTIFY'](https://www.postgresql.org/docs/9.1/static/sql-notify.html)功能,以便記錄由[另一個進程]處理(http://www.pomm-project.org/news/using-postgresql-notify-in-5-minutes.html)。 – greg

回答

0

首先你不需要自己實現這個邏輯之王。 Doctrine在內部跟蹤實體插入,更新,字段更改和刪除,並創建您可以收聽的相應事件。例如,當您創建新的Info實體並堅持它時,Doctrine將在調用flush操作時調度prePersist事件。你可以創建事件訂閱者來訂閱這些事件,並在那裏做你的邏輯。

要充分認識學說的生命週期事件退房官方學說文檔:symfony的文檔中描述http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html

事件用戶創建:http://symfony.com/doc/current/doctrine/event_listeners_subscribers.html#creating-the-subscriber-class

你也可以嘗試一下現有的第三方軟件包將登錄實體插入,更新和刪除:https://github.com/simplethings/EntityAuditBundle它也支持版本控制。

+0

嗨,謝謝你的回答。我在執行這個過程中遇到了很多問題。你能幫我一下嗎?我創建了一個可以獲取實體和entityManager的監聽器,但是如何使用它呢? –

+0

嗨Vadim Ashikhman,謝謝你的回答。之前沒有回答你,因爲我對此進行了大量的研究。但我卡住了。我所做的是一個suscriber postupdate,例如用戶/角色表。但這是我的第一個問題。比方說,我想改變用戶的角色,我如何將舊角色和新角色保存在我的更改表中?我怎樣才能知道我用什麼表來表達它,或者哪一列已經改變? –

+2

嘿!在事件對象的'preUpdate'事件中調用'getEntityChangeSet'方法,您將獲得每個更改的字段。這裏是'preUpdate'事件的一些文檔http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#preupdate –

相關問題