Doctrine JOIN ... ON ... 在注解中

Doctrine JOIN ... ON ... in annotations

我正在搜索如何使用 Doctrine 获得实体历史记录(或版本控制)。

这是我的表格(“代码”列标识实体,“标志”标识最新版本):

用户

+--------+-------------+------+
| Column |    Type     |  PK  |
+--------+-------------+------+
| id     | integer     | true |
| code   | integer     |      |
| flag   | boolean     |      |
| name   | string(255) |      |
+--------+-------------+------+

Post

+----------+----------+------+
|  Column  |   Type   |  PK  |
+----------+----------+------+
| id       | integer  | true |
| code     | integer  |      |
| flag     | boolean  |      |
| userCode | integer  |      |
| content  | longtext |      |
+----------+----------+------+

这是我的价值观:

用户

+----+------+------+------+
| id | code | flag | name |
+----+------+------+------+
|  1 |    1 | true | foo  |
|  2 |    2 | true | bar  |
+----+------+------+------+

Post

+----+------+-------+----------+----------------+
| id | code | flag  | userCode |    content     |
+----+------+-------+----------+----------------+
|  1 |    1 | false |        1 | First version  |
|  2 |    1 | false |        1 | Second version |
|  3 |    1 | true  |        2 | Third version  |
+----+------+-------+----------+----------------+

在这种情况下,我有 3 个版本的 post,它被编辑了两次。

使用 Doctrine(和 Symfony),我将有一个 joinColumns,其中 ON 在我的用户 class 中指定:

class User{

    /**
      * @ManyToMany(targetEntity="Post", inversedBy="author")
      * @JoinTable(name="user_posts",
      *    joinColumns={JoinColumn(name="user_code", referencedColumnName="code")
      *    inversedJoinColumns={@JoinColumn(name="post_code", referencedColumnName="code", on="flag=true")} <-- My ON parameter
      * )
      */
    private $posts

有没有简单的方法来满足这个条件?

我有我所有实体的历史记录,并将它们记录在 entityLog 实体中。我使用实体订户,当任何实体更新时,我插入一行包含实体名称、时间戳、登录用户等。然后我只是像最后 5 次更改一样过滤这些行,出于统计原因,按用户或按实体。

您可以设置一个这样的外部订阅者来监听所有实体更改和运行您的代码,例如documentation suggest or (for changes in a properties of a specific entity only) create a function with annotation in your entity class to use the Lifecycle Callback。对于第二种情况,不要忘记 class 中的注释 @ORM\HasLifecycleCallbacks() 否则它不会起作用。