我将以下实体作为Doctrine 2中Symfony 3.2.6项目的一部分:
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use QuoteBundle\Model\SourceTrait;
/**
* @ORM\Entity
* @ORM\Table(name="quote")
*/
class Quote
{
use SourceTrait;
use TimestampableEntity;
/**
* @ORM\Id
* @ORM\Column(type="integer",unique=true,nullable=false)
* @ORM\GeneratedValue
*/
private $quoteId;
/**
* @return int
*/
public function getQuoteId(): ?int
{
return $this->quoteId;
}
}
在另一个类动态中我需要获取实体的标识符(我只写了一个实体的例子 - 上面的那个 - 但这适用于我遍布的所有实体应用程序)所以我发现实现这一目标的最好方法是使用Doctrine中的getClassMetaData()
方法。
这是类中的动态代码:
$modelMetaData = $em->getClassMetadata($bundleName.':'.$modelName);
例如在
中翻译$modelMetaData = $em->getClassMetadata('QuoteBundle:Quote');
从那里我应该拥有与实体相关的所有数据。
问题之一是我们是两名开发人员,我们对getClassMetaData()
的结果不同。
我在Docker中使用Docker Compose运行堆栈,它完全相同,这意味着:相同的PHP版本(7.1.2),相同的Apache版本,相同的MySQL版本(这个版本位于堆栈外的公共服务器中)和相同的Symfony库。我已经检查,双重检查和三重检查,如果有必要,可以再次检查。
对于从现在开始的例子,我将自己称为Dev1,第二个开发人员将是Dev2。
Dev1代码:
$id = $em->getClassMetadata('QuoteBundle:Quote')->getIdentifier()[0];
dump($id);
quote_id
Dev2代码:
$id = $em->getClassMetadata('QuoteBundle:Quote')->getIdentifier()[0];
dump($id);
quoteId
正如您所看到的,获得的ID是不同的,这使得代码在Dev2环境中失败,我不知道还有什么可以看,因为一切似乎都适合我。
问题是:getIdentifier()
应该返回quote_id
(列名)还是quoteId
(映射名称)??