I know you're copying the old pattern, but while you're in here we could consider switching this to a db lookup instead of an ORM fetch, because it'd be cheaper.  The ORM lookup when it hits will load the whole object.  Off the top of my head I think that's:

```
while (db::build()
       ->from("items")
       ->where("parent_id", "=", $this->parent_id)
       ->where("id", $this->id ? "<>" : "IS NOT", $this->id)
       ->and_open()
       ->where("name", "=", $this->name)
       ->or_where("slug", "=", $this->slug)
       ->close()
       ->count_records()) {
  ...
}