我正在构建一个Symfony2项目并使用gedmo/doctrine-extensions(GitHub)来实现软删除.我的问题是,是否有一种方法可以"禁用"或"覆盖"软删除,甚至可以检测某些内容是否被软删除.
情况如下:
我有一个引用"用户"实体的"note"实体.特定注释引用已被软删除的用户.即使用户已被删除,它也会为TWIG的"已定义"逻辑返回true,甚至可以返回已删除用户的id.但是,如果我查询任何其他信息(包括标记是否已删除的"deletedAt"参数),我会收到500"未找到实体"错误.
由于数据实际上仍然存在,并且由于注释本身尚未删除,我仍然想说明谁写了注释,即使用户已被删除.
那可能吗?如果没有,我如何正确检测某些内容是否被软删除?就像我说的那样,$note->getUser()仍然会检索一个对象,并为任何null /"已定义"的比较返回true.
我正在使用Symfony 3.4和api平台构建API。我想在实体上使用软删除。我已经安装DoctrineExtensions和StofDoctrineExtensionsBundle。
config.yml:
doctrine:
    dbal:
        connections:
            default:
               […]
    orm:
        entity_managers:
            default:
                naming_strategy: doctrine.orm.naming_strategy.underscore
                connection: default
                mappings:
                    […]
                filters:
                    softdeleteable:
                        class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter
                        enabled: true
而我的实体:
<?php
namespace AppBundle\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
/**
 * MyEntity
 *
 * @ORM\Table(name="MyEntity", schema="MyEntity")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\MyEntityRepository")
 * @Gedmo\SoftDeleteable(fieldName="deletedAt")
 * @ApiResource
 */
class MyEntity
{
    /**
     * @var \DateTime
     * @ORM\Column(name="deleted_at", type="datetime")
     */
    private $deletedAt;
    […]
这是行不通的。我知道我需要配置一些东西(即EventManager),但我不知道如何做。这是我尝试创建实体时遇到的错误
Listener "SoftDeleteableListener" was not added to the EventManager!
我认为我已经完成了该页面说明的所有内容: …
几乎我们数据库中的每个表都有一个FK到审计表,它记录了创建,更新和删除的状态(日期和用户名).
我们将审计表映射到Auditing类并使用它如下:
@MappedSuperclass
public class BusinessObject extends DataObject {
    private static final long serialVersionUID = -1147811010395941150L;
    @OneToOne(fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
    @JoinColumn(name = "AUD_ID")
    private AuditingObject auditing;
...
正如您所期望的那样,几乎每个实体都从BusinessObject扩展而来.
有一种简单的方法可以说,对于每个businessObject,只接收"auditing.deleted为null".
我已经尝试在businessObject中添加@Where和@WhereJoinTable,但这似乎不像我期望的那样工作.
目前,我已经对我的一个查询做了这个工作,但我讨厌为所有查询执行此操作,因为我们有大约150个查询.
@NamedQuery(
    name="allCountries",
    query="SELECT c FROM Country c"
        + " LEFT JOIN FETCH c.labelDefinition "
        + " LEFT JOIN FETCH c.labelDefinition.translations "
        + " WHERE c.auditing.deleted is null"
        + " ORDER BY c.code"
)
Doctrine2文档说软删除行为应该更好地实现为状态模式但不提供任何该实现的示例.
如何使用状态模式实现软删除行为?
我正在使用Laravel 4和Eloquent ORM.在我的系统中,当有人删除记录时,必须检查它是否有任何相关记录.如果没有,则可以永久删除.但如果确实如此,只需执行softDeletion即可.
处理这种情况的方法是:尝试强制删除,如果由于引用完整性而抛出异常,则捕获它和softDelete.我知道这看起来很花哨,但它是由另一个开发人员制作的,我宁愿不要弄乱他的代码.
他所做的就是删除,然后如果它抛出异常,只需设置一个标志来"停用"记录.它确实运作良好.然而,当我接手时,我实现了softDeleting以减少花哨的东西.
现在,当它尝试强制删除时,它会抛出QueryException,但不会落入catch块.我已经尝试将Exception更改为\ Exception,QueryException,Illuminate\Database\QueryException,但没有成功.有任何想法吗?
为了更好地说明它:
就像这样:
try
{
    $contact->delete();
}
catch(Exception $ex)
{
    $contact->status = 0;
    $contact->save();
    //this works
}
而现在它是这样的:
protected $softDelete = true;
....
try
{
    $contact->forceDelete();
}
catch(Exception $ex)
{
    $contact->delete();
    //this doesn't work
}
萤火虫响应:
{"error":{"type":"Illuminate\\Database\\QueryException","message":"SQLSTATE[23000]: Integrity constraint violation: 1451 
Cannot delete or update a parent row: a foreign key constraint fails (`tst_db\/contact_company`, CONSTRAINT `fk_contact_company_contacts_id` 
FOREIGN KEY (`contact_id`) REFERENCES `contacts` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE) 
(SQL: delete from `contacts` where …我正在尝试从表消息中获取废弃的行:
public function trash() {
    return $this->onlyTrashed()
        ->where('user_id', '=', $this->_u)
        ->orWhere('receiver', '=', $this->_u)
        ->orderBy('deleted_at', 'desc')->get();
}
我收到此错误:
Method Illuminate\Database\Query\Builder::onlyTrashed does not exist.
我检查了 Builder 和 SoftDeletes 文件中是否有 onlyTrashed 方法,但它不存在,如何从消息表中查找已删除的消息?
我想到的唯一方法是创建一个方法,当delete_at不为空时,不返回消息,而trashed只返回那些不为空的消息。但我仍然想知道为什么这不起作用,因为它在以下网址的文档中:
https://laravel.com/docs/5.6/eloquent#soft-deleting
更多信息
是的,它在模型内部,是的,我添加了使用 SoftDeletes:
use Illuminate\Database\Eloquent\SoftDeletes;- 在上面
use SoftDeletes;开课后
让我将整个模型粘贴到此处:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\DB;
class Messages extends Model
{
use SoftDeletes;
protected $fillable = [
    'user_id', 'subject', 'text', 'receiver'
];
public $_u;
protected $dates = ['deleted_at'];
public function __construct() {
    $this->_u = auth()->user()->user_id; …有没有办法在中间实体(映射表)中使用@OneToMany和过滤软删除的多对多关联@ManyToOne?
product并且product_option_group是 N:M 关系。我正在使用该disabled_datetime列实现软删除,并希望ProductOptionGroup从Product实体中过滤一个集合。这篇文章正在使用@ManyToMany并@Where实现这一目标。我跟着,它工作(禁用product_option_groups 被过滤)。需要注意@Where的ProductOptionGroup类。
// `product` <-> `product-product_option_group` <-> `product_option_group`
@Entity
@Table(name = "product")
public class Product implements Serializable {
    ...
    @ManyToMany
    @JoinTable(name = "product-product_option_group",
            joinColumns = @JoinColumn(name = "product_id"),
            inverseJoinColumns = @JoinColumn(name = "product_option_group_id"))
    private final Set<ProductOptionGroup> productOptionGroups = new HashSet<>();
    ...
}
@Entity
@Table(name = "product_option_group")
@Where(clause = "disabled_datetime is null")
public …我有一个Audit类,用于存储按属性的动作.
class Audit < ActiveRecord::Base
  attr_accessible :activity
  belongs_to :by, :polymorphic => true
  belongs_to :on, :polymorphic => true
  attr_accessible :by, :on
end
for和:on的多态关联用于存储应审计的任何类型的对象.主要是因为多态在模式中被分解为类型和id,因此应该能够存储我的所有模型对象.
  create_table "audits", :force => true do |t|
    t.string   "activity"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
    t.integer  "on_id"
    t.string   "on_type"
    t.integer  "by_id"
    t.string   "by_type"
  end
我遇到的问题是所有被审计的对象都使用了偏执狂宝石.偏执宝石在每个模型表中引入了deleted_at列,通过其default_scope检查该模型上的每个查询,default_scope设置为"where(deleted_at is null)".偏执宝石还提供了一种方法.with_deleted,它允许通过转动default_scope进行直接查询,因此也返回具有偏执/软删除的对象.
但是,如果我有任何已删除的项目,我会尝试使用列出的所有审核项目.
Audit.all
我无法弄清楚如何告诉Rails为每个多态的运行查询查询:by和:on对象添加.with_deleted调用.我的猜测是,rails通过查找多态关系的对象
eval(type).find(id)
在我的情况下会给我一个应用了偏执宝石的default_scope的对象.
我试图在审计中覆盖self.find_by_sql,但没有运气.在我继续前进之前,我遇到了一些我需要阅读的Arel方法.
我看到以下解决方案,但我无法弄清楚如何做到这些.
任何和所有关于如何处理这个问题的建议将不胜感激.
我想制作一个使用SoftDeletes命名的特征SoftDeletesWithStatus,它也会更新状态列。我的问题是我想在 的函数中间实现我的代码,SoftDeletes如下所示:
protected function runSoftDelete() {
    $query = $this->newQueryWithoutScopes()->where($this->getKeyName(), $this->getKey());
    $time = $this->freshTimestamp();
    $columns = [$this->getDeletedAtColumn() => $this->fromDateTime($time)];
   //I want to implement my code here
    $this->{$this->getDeletedAtColumn()} = $time;
    if ($this->timestamps && ! is_null($this->getUpdatedAtColumn())) {
        $this->{$this->getUpdatedAtColumn()} = $time;
        $columns[$this->getUpdatedAtColumn()] = $this->fromDateTime($time);
    }
    $query->update($columns);
}
public function restore() {
    if ($this->fireModelEvent('restoring') === false) {
        return false;
    }
    $this->{$this->getDeletedAtColumn()} = null;
    //I want to implement my code here
    $this->exists = true;
    $result = $this->save();
    $this->fireModelEvent('restored', false);
    return …默认情况下,Azure 对所有 keyvault 密钥强制执行清除保护,这在使用 terraform 时会引起一些麻烦。特别是,这可能会遇到这样的情况:您使用磁盘加密密钥删除了虚拟机,因此 terraform 也从密钥库中删除了磁盘加密密钥。
\n如果稍后您尝试重新创建该虚拟机(当然,您使用相同的加密密钥名称,因为它基于虚拟机名称),则创建过程将始终失败
\nazurerm_key_vault_key.disk_encryption[5]: Creating...\n\xe2\x95\xb7\n\xe2\x94\x82 Error: Creating Key: keyvault.BaseClient#CreateKey: Failure responding to request: StatusCode=409 -- Original Error: autorest/azure: Service returned an error. Status=409 Code="Conflict" Message="Key vmname-custom-disk-encryption is currently in a deleted but recoverable state, and its name cannot be reused; in this state, the key can only be recovered or purged." InnerError={"code":"ObjectIsDeletedButRecoverable"}\n\xe2\x94\x82 \n\xe2\x94\x82   with azurerm_key_vault_key.disk_encryption[5],\n\xe2\x94\x82   on encryption.tf line 12, in resource "azurerm_key_vault_key" "disk_encryption":\n\xe2\x94\x82   12: resource "azurerm_key_vault_key" "disk_encryption" {\nsoft-delete ×10
laravel ×3
php ×3
hibernate ×2
symfony ×2
azure ×1
doctrine ×1
doctrine-orm ×1
exception ×1
java ×1
jpa ×1
laravel-5.6 ×1
orm ×1
php-5.3 ×1
spring-boot ×1
state ×1
terraform ×1