首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原则PHPStan实体关系集从未写过,只读过

原则PHPStan实体关系集从未写过,只读过
EN

Stack Overflow用户
提问于 2022-05-29 13:01:06
回答 1查看 266关注 0票数 0

我试图根据Doctrine和PHPStan使用正确的类型,但是,对于实体关系,我似乎无法纠正它。

我使用的是PHP8.1.6、Doctrine2.6.3、PHPStan 1.7.3和PHPStan/Doctrine1.3.6。

我的实体看起来是这样的

代码语言:javascript
复制
#[ORM\Entity]
class Thing
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(options: ['unsigned' => true])]
    private ?int $id;

    #[ORM\Column]
    private string $name;

    /** @var Collection&iterable<Item> $items */
    #[ORM\OneToMany(mappedBy: 'thing', targetEntity: Item::class)]
    private Collection $items;

    public function getId(): ?int
    {
        return $this->id;
    }

    /**
     * @return iterable<Items>
     */
    public function getItems(): iterable
    {
        return $this->items;
    }
}

对于ID,这不是抱怨(原则规则被加载到PHPStan中,它工作得很好)。然而,对于$items集合来说,它说的是“从不写,只读”。这是没有意义的,因为它是一个集合,不会被写入(而是通过它的方法添加到其中)。

我不太明白为什么它给我这个错误,我似乎找不到很多关于它,除了“它应该工作”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-29 16:36:16

对于该私有财产,您没有“设置器”或“加法器/移除器”。所以,PhpStan确实是对的。

要么从该关系的反转侧(也就是在Thing类中)完全删除该属性,要么添加一些“加法器/移除器”。

这通常是这样的。

代码语言:javascript
复制
public function addItem(Item $item): self
{
    if (!$this->items->contains($items)) {
        $this->items[] = $item;
        // optional but keeps both sides in sync
        $item->setThing($this);
    }

    return $this;
}

public function removeItem(Item $item): self
{
    $this->items->removeElement($item);
    // should your Item::thing be not nullable, skip this
    $item->setThing(null);

    return $this;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72423873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档