【问题标题】:restore() throws InvalidArgumentExceptionrestore() 抛出 InvalidArgumentException
【发布时间】:2019-10-08 00:08:58
【问题描述】:

这很好用:

$post->comments()->withTrashed()->get()->each->delete();

因为它确实删除了 6 行,所以 each 作为集合返回。

但是,这会引发异常:

$post->comments()->withTrashed()->get()->each->restore();

我注意到它还在数据库中恢复了 1 行(第一行)(集合有 6 行)。

上下文:当我恢复帖子时,我在观察者中使用此类代码来恢复评论。

以下将抛出完全相同的异常InvalidArgumentException with message 'Illegale operator and value combination.'

$post->comments()->withTrashed()->where('deleted_at', '>=', $post->deleted_at)->get()->each->restore();

where() 条件允许我仅恢复与帖子软删除一起软删除的 cmets(这样它就不会恢复在整个帖子删除之前被版主删除的 cmets)。

【问题讨论】:

  • 看起来你可能会遇到这个error 是相应的$value 为空。 The condition 可能会抛出错误的地方。
  • 我发现了这个错误。观察者在restored() Post 模型事件上触发。所以$post->deleted_at 属性在第一次迭代后是null(这解释了为什么它只更新了第一个数据库行然后抛出异常,从那时起它在null 上执行>=。我设法快速修复将restored() 更改为@987654335 @但我对此并不满意。我想在帖子恢复后恢复 cmets,而不是之前。

标签: php laravel eloquent laravel-6 php-7.3


【解决方案1】:

$post->cmets()->onlyTrashed()->get()->each->restore();

不知道它是否有帮助,但你可以试试这个。由于恢复只能对已删除的帖子起作用,这可能是导致问题的原因。

【讨论】:

  • 另外我认为你在删除时不需要 withTrashed() 。因为被删除的评论不能被删除两次。我敢肯定,如果你运行这两次,它会打开一个像恢复一样的问题。就做
  • $post->cmets()->get()->each->delete();
【解决方案2】:
        $post->comments()
            ->onlyTrashed()->where('deleted_at', '>=', $post->deleted_at)
            ->get()
            ->each->restore();

这确实有效。问题是因为我的观察者在restored 触发,这将导致$post->deleted_at 在第一次迭代后立即变为null。使用restoring() 模型事件而不是restored() 解决了问题。

这(上)回答了我最初的问题。

我还没有找到继续使用restored 的方法(我希望在帖子恢复后恢复cmets),因为restored 使$post->deleted_at 变为null,因此在我的where() 中无效健康)状况。我需要找到一种方法来保持原始$post->deleted_at 值,同时使用restored()getDirty()getChanges() 没有帮助。我将在 3 天内接受我自己的答案,除非有人分享了同时保留 restored 事件的方法。我相信这超出了最初问题的范围?

【讨论】:

    猜你喜欢
    • 2013-04-27
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 2021-01-25
    • 2015-06-10
    相关资源
    最近更新 更多