【发布时间】: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