Scala Skinny ORM Soft Deletion获取已删除的记录

时间:2015-08-26 10:13:12

标签: scala playframework

我已经从PHP ORM(Laravel Eloquent)转向Scala。而且我发现与Eloquent最相似的是Skinny ORM。 使用它创建简单的CRUD应用程序后,我发现了如何使用软删除获取删除的记录的问题?

我还检查了Skinny ORM中的代码,似乎他们不支持它,不确定我是否找不到它或者他们真的不支持它。

1 个答案:

答案 0 :(得分:0)

最后,我实现了删除自己。 这是我做的特质:

trait SoftDelete[Entity] extends CRUDFeatureWithId[Long, Entity] {

  /**
   * deleted_at timestamp field name.
   */
  def deletedAtFieldName = "deletedAt"

  var withDeletion = false;

  def withDeleted = {
    withDeletion = true
    this
  }

  override def defaultScopeForUpdateOperations: Option[SQLSyntax] = {
    val c = defaultAlias.support.column
    val scope = sqls.isNull(c.field(deletedAtFieldName))
    if(withDeletion)
      super.defaultScopeForUpdateOperations
    else
      super.defaultScopeForUpdateOperations.map(_.and.append(scope)) orElse Some(scope)
  }

  override def defaultScope(alias: Alias[Entity]): Option[SQLSyntax] = {
    val scope = sqls.isNull(alias.field(deletedAtFieldName))
    if(withDeletion)
      super.defaultScope(alias)
    else
      super.defaultScope(alias).map(_.and.append(scope)) orElse Some(scope)
  }

  override def deleteBy(where: SQLSyntax)(implicit s: DBSession = autoSession): Int = {
    updateBy(where).withNamedValues(column.field(deletedAtFieldName) -> DateTime.now)
  }
}

我们可以像这样调用模型:

User.withDeleted.findAll

不确定这是否是最好的方法,因为我无法直接在库中编辑