我有以下问题,我使用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声明,但它要么做任何事情要么抛出一些不可用的堆栈跟踪,当我深入了解它并不足以理解问题是什么以及如何纠正它。
我想我只是不明白这些方法是如何真正起作用的,如果有人可以通过一个例子来启发我,那将非常感激! 谢谢你的时间! :)