Вопрос в заголовке.
У меня есть собственный класс IP-адресов, который использует функции INET_NTOA
& INET_ATON
и расширяет Doctrine \ DBAL \ Types \ Type.
Что я пробовал
1
$qb->update(static::class, 't');
$qb->set('t.field', false);
$qb->where($qb->expr()->eq('t.ip', '127.0.0.1'));
$qb->getQuery()->execute();
, который вызывает [Syntax Error] line 0, col 41: Error: Expected Literal, got 'WHERE'
2
$qb->update(static::class, 't');
$qb->set('t.field', $qb->expr()->literal(false));
$qb->where($qb->expr()->eq('t.ip', '127.0.0.1'));
$qb->getQuery()->execute();
, который вызывает [Syntax Error] line 0, col 63: Error: Expected Literal, got '127.0.0.1'
3
$qb->update(static::class, 't');
$qb->set('t.field', $qb->expr()->literal(false));
$criteria = Criteria::create()->where(Criteria::expr()->eq('t.ip', '127.0.0.1'));
$qb->addCriteria($criteria);
$qb->getQuery()->execute();
, что вызывает:
An exception occurred while executing 'UPDATE table SET field = 0 WHERE ip = ?' with params ["127.0.0.1"]:
SQLSTATE[22007]: Invalid datetime format: 1292 Truncated incorrect DOUBLE value: '127.0.0.1'`
UPD:
Мой пользовательский IPType:
namespace app\types;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;
class IpType extends Type
{
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform): string
{
return $platform->getIntegerTypeDeclarationSQL(['unsigned' => true]);
}
public function canRequireSQLConversion(): bool
{
return true;
}
public function convertToPHPValueSQL($sqlExpr, $platform): string
{
return sprintf('INET_NTOA(%s)', $sqlExpr);
}
public function convertToDatabaseValueSQL($sqlExpr, AbstractPlatform $platform): string
{
return sprintf('INET_ATON(%s)', $sqlExpr);
}
public function getName(): string
{
return 'ip_address';
}
}
и объявление IP в моемКласс сущности:
/**
* @Column(type="ip_address")
* @var string
*/
protected $ip;