Laravel无法回复softdeletes字段错误Carbon Data Missing

时间:2016-09-20 04:33:37

标签: php laravel laravel-5 eloquent

我想检查数据是否已被删除。所以我使用雄辩如:

$check = ModelName::withTrashed()->where("id","=",$id)
->select("id","deleted_at","other_field")
->get();

foreach ($check as $rw) {
echo $rw->id; // it print the id
echo $rw->other_field; //also print the field value
echo $rw->deleted_at; // Error:

//InvalidArgumentException in Carbon.php line 425:
//Data missing
//at Carbon::createFromFormat('Y-m-d H:i:s.000', '2016-09-19 07:06:56') in Model.php line 2955
}

然后我尝试转储以查看值:

dd($check);

deleted_at的结果回显它的值如下:

  #attributes: array:3 [▼
    "id" => 1
    "deleted_at" => "2016-09-19 07:06:56"

1 个答案:

答案 0 :(得分:1)

编辑:
在错误消息中,Carbon使用的日期格式似乎有点偏。尝试手动在模型中指定它:

protected $dateFormat = 'Y-m-d H:i:s';

我将离开答案的第一部分,因为这也可能有助于通过搜索偶然发现此主题的人。

dd()在第一个值之后停止,在您的情况下被软删除,因此您只需在错误之前停止执行。如果删除dd,循环将继续,直到它中断。因此,如果您想检查错误之前的所有数据,请使用print_r而不是dd(),这样输出就不会停止脚本。

现在关于你的例外。问题是当Carbon鼓励一个NULL字段时 - 一个未被删除的记录。它试图将null解析为日期并且显然失败。

您的方法应该更改 - 您可以在尝试访问记录之前检查记录是否已被删除:deleted_at时间戳:

$check = ModelName::withTrashed()->where("id","=",$id)
  ->select("id","deleted_at","other_field")
  ->get();

foreach ($check as $rw) {
  echo $rw->id; // it print the id
  echo $rw->other_field; //also print the field value

  if ($rw->trashed())
    echo $rw->deleted_at;
}

另一个不那么优雅的解决方案是从模型中的$ dates数组中删除deleted_at并停止自动解析。然后,您将在模型中编写自定义访问器:

public function getDeletedAtAttribute($value)
{
    return $value ? Carbon::createFromFormat('Y-m-d H:i:s', $value) : NULL;
}

我会推荐第一种方法。