如何在 Symfony 中为一个实体使用两个不同的表?
我有一个名为“Article”的实体,它代表博客文章。
它由以下属性组成:
- 文章 ID
- 标题
- 作者
- 文字
- 日期
- 观看次数
我记得读到过,当向表缓存写入内容时,表缓存会受到一定程度的破坏。这就是为什么我想要一个单独的表,仅包含文章 ID 和浏览次数。
最佳答案
您可以有一个表article_views,其中article_id作为FK和访问计数器。
您可以在每次访问时使用 Propel 和 symfony 1.4 通过其对等类中的对等方法“即时”更新它,方法是提供文章 ID 和连接。
public static function incrementVisits($id, PropelPDO $con = null)
{
$con = (is_null($con))
? Propel::getConnection(self::DATABASE_NAME, Propel::CONNECTION_WRITE)
: $con;
$sql = sprintf('UPDATE %s SET %s = %s + 1 WHERE %s = %d',
self::TABLE_NAME, self::VIEWS, self::VIEWS,
self::ARTICLE_ID, $id);
$stmt = $con->prepare($sql);
return $stmt->execute();
}
您可以将该登录包装在文章中的方法中:
public function incrementViews(PropelPDO $con = null)
{
return ArticleView::incrementVisits($this->getId(), $con);
}
然后你可以在文章中的方法中实现类似的东西:
public function getViews(PropelPDO $con = null)
{
return $this->getArticleView($con)->getViews();
}
另一种可能的离线/延迟处理解决方案是使用消息队列系统,并在每次访问时放一 strip 有文章 ID 的消息。然后在给定的时间间隔内检索消息并使用与上述方法类似的方法更新表,但使用您要添加的新访问的变量。
此选项将使 UPDATE 查询加载更加可预测,但会引入一些延迟。
希望这有帮助。我猜你指的表缓存是 MySQL 上 SELECT 的缓存。
关于php - Symfony 中 View 数量的单独表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9516703/