使用ipv6和Doctrine

时间:2017-07-10 16:02:42

标签: sql symfony doctrine ipv6 ipv4

我有以下问题,我使用Symfony和Doctrine,我需要将ipv6和ipv4存储在同一个SQL varbinary字段中。

我希望我的实体有一个字符串ip属性,映射到我的varbinary SQL ip字段,当我使用doctrine实体管理器持久保存新创建/更新的实体时,它会使用INET6_ATON SQL函数自动将其转换为varbinary。 / p>

我读了一些关于自定义学说类型定义的内容,但我找不到足够的信息让它自己工作。 我认为正确的方法是创建一个自定义类型,如MyIpType并覆盖Doctrine SQL声明,但我不知道如何做到这一点。

我的第一次尝试是覆盖varbinary类型定义,doctrine抛出错误' unknown field varbinary'而我在dbal symfony配置中声明了它,如文档中所述。

我的第二次尝试是创建自己的自定义类型,但我无法使其工作,甚至没有提到重写SQL声明。

有人可以帮忙解决这个问题吗?

我已宣布我的类型如下:

<?php
namespace CoreBundle\Types;

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

/**
  * My custom ip type.
 */
class MyIpType extends Type
{
    const MYIP = 'myip'; // modify to match your type name

    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
    {
        return 'MyIp';
    }

    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        return new MyIp($value);
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        return $value->toDecimal();
    }

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

    public function canRequireSQLConversion()
    {
        return true;
    }
}

在config.yml中注册如下:

doctrine:
    dbal:
        driver        : pdo_mysql
        host          : "%database_host%"
        port          : "%database_port%"
        dbname        : "%database_name%"
        user          : "%database_user%"
        password      : "%database_password%"
        charset       :  UTF8
        options       : "%pdo_options%"
        types :
            myip : CoreBundle\Types\MyIpType

将我的两个IP字段映射为:

/**
 * @var myip
 *
 * @ORM\Column(name="ipv6_range_start", type="binary", nullable=true)
 */
private $ipv6RangeStart;

/**
 * @var myip
 *
 * @ORM\Column(name="ipv6_range_end", type="binary", nullable=true)
 */
private $ipv6RangeEnd;

现在我无法理解接下来要做什么,我已经尝试了this documentation中显示的一些自定义内容来覆盖SQL声明,但它要么做任何事情要么抛出一些不可用的堆栈跟踪,当我深入了解它并不足以理解问题是什么以及如何纠正它。

我想我只是不明白这些方法是如何真正起作用的,如果有人可以通过一个例子来启发我,那将非常感激! 谢谢你的时间! :)

0 个答案:

没有答案