Doctrine一对多双向关联不使用自定义类型

时间:2013-12-22 06:46:08

标签: php symfony orm doctrine-orm fosrestbundle

我一直在使用Symfony2和FosRestBundle开发REST api。 一切都工作正常,然后要求我必须混淆所有的资源ID。

我是通过在Doctrine中添加自定义类型来实现的。 但现在,我的协会工作不正常。

以下是代码示例: 在Track中我有:

/**
 *
 * @ORM\Column(name="id", type="encryptedid")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 * @expose
 * @Groups({"FULL_ALBUM","FULL_TRACK","FULL_ARTIST","FULL_PLAYLIST","ARTIST_TRACKS","LIST_TRACKS"})
 * 
 */
private $id;

/**
 * @ORM\ManyToOne(targetEntity="Album", inversedBy="tracks")
 * @expose
 * @Groups({"FULL_TRACK","FULL_ARTIST"})
 */
private $album;

在相册中,我有:

/**
 *
 * @ORM\Column(name="id", type="encryptedid")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 * @expose
 * @Groups({"FULL_ALBUM","FULL_TRACK","FULL_ARTIST","ARTIST_ALBUMS"})
 */
private $id;
/**
 *
 * @ORM\OneToMany(targetEntity="Track", mappedBy="album")
 * @Groups({"FULL_ALBUM"})
 * @expose
 */
private $tracks;

问题是当我使用自定义类型时,无法从ALBUM对象访问TRACKS。

注意:使用自定义类型时,doctrine:schema:validate给出:

[Mapping] OK - 映射文件正确。

[数据库]失败 - 数据库架构与当前映射文件不同步。

但是当我转换回INT id时会出现此消息。

我正在做的任何建议或错误?

以下是我的自定义类型:

<?php

namespace My\RestApiBundle\Type;

use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;

class EncryptedIdType extends Type {

    private $service;

    const MYTYPE = 'encryptedid'; // modify to match your type name

    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) {
        return $platform->getIntegerTypeDeclarationSQL($fieldDeclaration);
    }

    public function convertToPHPValue($value, AbstractPlatform $platform) {
        $this->service = new \My\RestApiBundle\Service\MyEncrypter;
        return $this->service->encrypt($value);
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform) {
        $this->service = new \My\RestApiBundle\Service\MyEncrypter;
        return $this->service->decrypt($value);
    }

    public function getName() {
        return self::MYTYPE;
    }

}

我已将其添加到以下代码中的学说中:

<?php

namespace My\RestApiBundle;
use Doctrine\DBAL\Types\Type;
use Symfony\Component\HttpKernel\Bundle\Bundle;

class MyRestApiBundle extends Bundle
{
    public function boot()
    {
        $em = $this->container->get('doctrine.orm.entity_manager');
        Type::addType('encryptedid', "My\RestApiBundle\Type\EncryptedIdType");
        $em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('encryptedid','encryptedid');
    }
}

0 个答案:

没有答案