【问题标题】:Eloquent deleting more records than intended?雄辩地删除比预期更多的记录?
【发布时间】:2016-06-27 19:29:26
【问题描述】:
Post::whereReplyTo($request->input('reply_to'))
        ->orderBy('updated_at', 'desc')
        ->offset(Config::PAGE_SIZE * Config::MAX_PAGES)
        ->take(1024)
        ->delete();

我打算在帖子数达到 4 时触发它,以便在这种情况下保持最多 4 个帖子。

问题是它会删除所有帖子,而不仅仅是那些我打算删除的帖子

我越来越沮丧,为什么会这样?没有错误,我toSql'd查询并没有错,selction部分是正确的,我试过了,为什么要删除所有帖子???

【问题讨论】:

  • $request->input('reply_to')Config::PAGE_SIZEConfig::MAX_PAGES 当你 dd()/var_dump() 时它们的值是多少?还有Post::whereReplyTo($request->input('reply_to'))->orderBy('updated_at', 'desc')->offset(Config::PAGE_SIZE * Config::MAX_PAGES)->take(1024)->toSql()的输出是什么?
  • 在这种情况下为负 1。但这是我的应用程序中的有效值,页面大小为 2,最大页面数为 2
  • 现在就坚持生病的toSql吧
  • select * from a2_posts where reply_to = ?按updated_at desc 限制 1024 偏移量 4 排序
  • 我假设?意味着它的参数化并且在执行我猜的查询时添加回复?

标签: laravel orm eloquent


【解决方案1】:

好吧,如果你的研究是正确的,你应该仍然可以通过两个步骤来完成:

$delete_posts = Post::select('id')->whereReplyTo($request->input('reply_to'))
        ->orderBy('updated_at', 'desc')
        ->offset(Config::PAGE_SIZE * Config::MAX_PAGES)
        ->take(1024)
        ->get()->toArray();

Post::whereIn('id', $delete_posts)->delete();

【讨论】:

  • 是的,非常感谢你的帮助,我的朋友,为你点赞+打勾
  • 实现这个我意识到它应该是 ->get(["id"])
【解决方案2】:

我想我正在做某事 运行删除后,我附加了一个侦听器来记录最后一个查询 结果是:

delete from `a2_posts` where `reply_to` = ? order by `updated_at` desc limit 1024

那么我的偏移量在哪里?我用谷歌搜索了一下,我认为你不能使用 offset + delete。

迟钝?是的,非常喜欢。

这就是我更喜欢 Mongo 的原因。

这更有意义。

来源:Mysql delete statement with limit

所以我想我会做的是查询,然后迭代,然后删除。

SQL 是纯粹的天才,有时我向上帝发誓。

【讨论】:

    猜你喜欢
    • 2018-01-11
    • 2023-02-04
    • 1970-01-01
    • 2014-09-27
    • 2018-10-22
    • 1970-01-01
    • 2020-05-30
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多