Как обновить таблицу с помощью Doctrine2 ORM и заставить ее автоматически конвертировать типы данных? - PullRequest
0 голосов
/ 03 января 2019

Вопрос в заголовке.

У меня есть собственный класс 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;

1 Ответ

0 голосов
/ 03 января 2019

Вам необходимо реализовать пользовательский тип отображения класс, например, IP, и использовать его для определения отображений для ваших сущностей.Преобразование значений может быть выполнено с использованием функций ip2long() и long2ip(), для получения дополнительной информации по этой теме при необходимости обратитесь к этому ответу.

...