软删除是个好主意还是坏主意?
您只需将其标记为IsDeleted = true,而不是实际删除数据库中的记录,并且在恢复记录后,您可以将其标记为False.
这是一个好主意吗?
最好是物理删除记录,然后将其移动到存档数据库,如果用户想要记录回来,那么软件会在存档中查找记录并重新创建它吗?
执行逻辑/软删除记录(即设置一个表明记录被删除的标志)而不是实际或物理删除记录的优点是什么?
这是常见做法吗?
这样安全吗?
在Laravel 5.1中有一种很好的方法来检查一个雄辩的模型对象是否被软删除了吗?我不是在谈论选择数据,而是一旦我拥有了对象,例如Thing::withTrashed()->find($id)
到目前为止,我能看到的唯一方法是
if ($thing->deleted_at !== null) { ... }
Run Code Online (Sandbox Code Playgroud)
我没有在API中看到任何允许的相关方法
if ($thing->isDeleted()) { ... }
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现软删除概念.
这是我的对象:
class Post extends Eloquent {
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'posts';
protected $softDelete = true;
...
Run Code Online (Sandbox Code Playgroud)
软删除已开启.
现在,如果我'删除'帖子,它会获得'deleted_at'时间戳:

问题是,当我搜索或仅用于all()显示帖子时,会在那里显示软删除的项目.怎么了?
对于未来的访问者:对于EF6,您可能最好使用过滤器,例如通过此项目:https://github.com/jbogard/EntityFramework.Filters
在我们正在构建的应用程序中,我们应用"软删除"模式,其中每个类都有一个'已删除'布尔.实际上,每个类都只是继承自这个基类:
public abstract class Entity
{
public virtual int Id { get; set; }
public virtual bool Deleted { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
举一个简短的例子,假设我有类GymMember和Workout:
public class GymMember: Entity
{
public string Name { get; set; }
public virtual ICollection<Workout> Workouts { get; set; }
}
public class Workout: Entity
{
public virtual DateTime Date { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我从数据库中获取健身房成员列表时,我可以确保没有获取任何"已删除"健身房成员,如下所示:
var gymMembers = context.GymMembers.Where(g => !g.Deleted);
Run Code Online (Sandbox Code Playgroud)
然而,当我遍历这些健身房成员时,他们Workouts从数据库加载而不考虑他们的Deleted旗帜.虽然我不能责怪实体框架没有理解这一点,但我想以某种方式配置或拦截延迟属性加载,以便永远不会加载已删除的导航属性.
我一直在考虑我的选择,但它们看起来很稀缺: …
问题
在处理产品和订单的Web应用程序中,我希望维护前员工(用户)与他们处理的订单之间的信息和关系.我想维护过时的产品和包含这些产品的订单之间的信息和关系.
但是,我希望员工能够解除管理界面的混乱,例如删除以前的员工,过时的产品,过时的产品组等.
我正在考虑实现软删除.那么,人们通常如何做到这一点?
我的直接想法
我的第一个想法是flag_softdeleted在应该是软删除的每个对象表中粘贴一个" TINYINT NOT NULL DEFAULT 0"列.或者可以使用时间戳代替?
然后,我在每个相关的GUI中提供"显示已删除"或"取消删除"按钮.单击此按钮,您将在结果中包含软删除的记录.每个删除的记录都有一个"恢复"按钮.这有意义吗?
你的意见?
此外,我很感激任何相关资源的链接.
以下软删除代码对我来说很好:
$post = Post::find($post_id);
$post->delete();
Run Code Online (Sandbox Code Playgroud)
deleted_at字段已更新.但这给了我一个错误:
$post = Post::find($post_id);
$post->restore();
Run Code Online (Sandbox Code Playgroud)
这是错误:
exception 'Symfony\Component\Debug\Exception\FatalErrorException' with message 'Call to a member function restore() on a non-object'
Run Code Online (Sandbox Code Playgroud)
我很难过.到目前为止谷歌没有帮助.
SQL总是有一个很棒的功能:级联删除.你事先计划好,什么时候删除东西,BAM!无需担心所有这些依赖记录.
但是,现在实际上删除任何东西几乎都是禁忌.您将其标记为已删除并停止显示.不幸的是,当存在依赖记录时,我无法找到可靠的解决方案.我总是手动编写复杂的软删除网络.
那里有一个我完全错过的更好的解决方案吗?
我有这个发票表,它具有以下结构
id | name | amount | deleted_at
2 iMac 1500 | NULL
Run Code Online (Sandbox Code Playgroud)
以及具有以下结构的付款表
id | invoice_id | amount | deleted_at
2 2 1000 | NULL
Run Code Online (Sandbox Code Playgroud)
发票模型
class Invoice extends Model {
use SoftDeletes;
}
Run Code Online (Sandbox Code Playgroud)
这是删除发票的代码
public function cance(Request $request,$id)
{
$record = Invoice::findOrFail($id);
$record->delete();
return response()->json([
'success' => 'OK',
]);
}
Run Code Online (Sandbox Code Playgroud)
付款模式
class Payment extends Model {
use SoftDeletes;
}
Run Code Online (Sandbox Code Playgroud)
Invoice表上的softDelete工作正常,但其相关记录(付款)仍然存在.如何使用softDelete删除它们?
我按照这个例子来测试softdeletable运行Symfony 2.1.0-DEV的项目的扩展.
我配置我的config.yml如下:
orm:
auto_generate_proxy_classes: %kernel.debug%
auto_mapping: true
filters:
softdeleteable:
class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter
enabled: true
mappings:
translatable:
type: annotation
alias: Gedmo
prefix: Gedmo\Translatable\Entity
# make sure vendor library location is correct
dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity"
loggable:
type: annotation
alias: Gedmo
prefix: Gedmo\Loggable\Entity
dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Loggable/Entity"
tree:
type: annotation
alias: Gedmo
prefix: Gedmo\Tree\Entity
dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Tree/Entity"
Run Code Online (Sandbox Code Playgroud)
我的控制器动作:
/**
* @Route("/del", name="del_article")
*/
public function delAction() {
$em = $this->getDoctrine()->getEntityManager();
$article = $em->find('Article', 3);
$em->remove($article);
$em->flush();
die('ok');
}
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,它总是显示异常: Listener "SoftDeleteableListener" was not …
soft-delete ×10
eloquent ×4
laravel ×4
php ×3
sql ×3
database ×2
c# ×1
doctrine-orm ×1
laravel-4 ×1
laravel-5 ×1
laravel-5.1 ×1
mysql ×1
symfony-2.1 ×1