【问题标题】:Symfony - Doctrine Annotations default value for a foreign keySymfony - 外键的 Doctrine Annotations 默认值
【发布时间】:2020-06-10 02:54:09
【问题描述】:

我们有两个具有多对一基数关系的实体。 文章实体具有三种状态。此状态记录在 ArticleStatus 表中。

ArticleStatus 表格内容:

标识 |状态

1 - 待处理

2 - 已批准

3 - 拒绝

Entity/Article.php

<?php

namespace App\Entity;

use App\Repository\ArticleRepository;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass=ArticleRepository::class)
 */
class Article
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string")
     */
    private $article_name;


    /**
     * @ORM\ManyToOne(targetEntity=ArticleStatus::class)
     * @ORM\JoinColumn(nullable=false)
     */
    private $status;

    ...

    public function getStatus(): ?ArticleStatus
    {
        return $this->status;
    }

    public function setStatus(?ArticleStatus $status): self
    {
        $this->status = $status;

        return $this;
    }
}

实体/ArticleStatus.php

<?php

namespace App\Entity;

use App\Repository\ArticleStatusRepository;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass=ArticleStatusRepository::class)
 */
class ArticleStatus
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=100, nullable=false)
     */
    private $status;

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

    public function getStatus(): ?string
    {
        return $this->status;
    }

    public function setStatus(string $status): self
    {
        $this->status = $status;

        return $this;
    }
}

每篇新文章都需要创建为待处理状态。如何使用 Doctrine Annotations 将默认值 1 设置为 status_id 外键?

【问题讨论】:

  • 因此,您选择使其成为一个完整的实体,而不是拥有一个本质上是枚举的列“状态”。我的建议是让它成为一个简单的值,而不是一个实体。或者你真的有充分的理由这样做吗?
  • @Jakumi 如果您决定添加新状态、删除状态或重命名状态,您将不得不遍历代码中使用它的每个位置并对其进行修改以分配给更改。
  • @MartinM。如果将“状态”替换为“标签”,我可能会同意。但是,在这种特殊情况下,我强烈反对。查看提供的实体和问题描述的表述方式,我确信状态是业务逻辑,并且代码中可能存在与 id 和/或名称相关的条件,这将导致添加或重命名(或两者)无论如何都很奇怪,需要更改代码。所以要么状态实体不好,要么首先使用实体​​是不好的。此外,它看起来不会有更多的状态(pl。)。我会使用常量。
  • @Jakumi 是的,如果你 100% 确定不会有任何变化,那么常量会让事情变得更简单。无论如何,添加或删除都需要更改您的业务逻辑。但是,如果您有一个列表并想要显示状态,您将需要一个需要修改的开关(可能在多个位置)或添加一个迁移以更改所有记录的值。这是一些额外的工作,但可以避免,并且不会损失太多性能。

标签: php symfony doctrine-orm annotations


【解决方案1】:

在注释中这是不可能的。您可以尝试几种不同的方法,我建议您进行 pre-persist 事件。

可能duplicate

【讨论】:

  • 谢谢你,马丁!创建文章时,我将使用默认字符串值解决它。所以,我不再需要实体 ArticleStatus 了。我将在 Article 实体中设置“Pending”字符串值。
猜你喜欢
  • 1970-01-01
  • 2014-06-25
  • 2011-03-23
  • 2018-03-21
  • 2011-08-06
  • 2015-01-10
  • 2016-04-25
  • 2014-11-15
  • 2016-09-01
相关资源
最近更新 更多