如何为Laravel条件内的$item->loggable添加Comment类型提示?
可行的类型提示方案
你可以通过临时变量+类型注释的方式解决这个问题,既不会提前加载Comment实例,又能让IDE识别到正确的类型:
foreach ($items as $item) { // ... if ($item->loggable_type === Comment::class) { /** @var Comment $loggable */ $loggable = $item->loggable; $loggable->resetDates(); } // ... }
原理很直接:
- 先通过
loggable_type判断类型,避免提前触发关联加载 - 把
$item->loggable赋值给临时变量$loggable,并用/** @var Comment $loggable */给变量做类型注释,IDE就能正确识别这个变量的类型,提供代码提示和类型检查
如果想让代码更简洁,还可以在Item模型中封装一个类型判断的辅助方法:
// 在Item模型中添加 public function isComment(): bool { return $this->loggable_type === Comment::class; }
之后在循环里这样用:
foreach ($items as $item) { // ... if ($item->isComment()) { /** @var Comment $loggable */ $loggable = $item->loggable; $loggable->resetDates(); } // ... }
这两种方法都不会提前加载关联实例,同时解决了类型提示的问题。
内容的提问来源于stack exchange,提问作者Patrick Nomad
相关产品推荐
相关产品推荐

