Doctrine nezavolá se convertToDatabaseValue(). Problém s UUID
- aliamjid
- Člen | 8
Ahoj,
Začal jsem nově používat doctrine a moc s ní neumím.
Problém je následujíci.
Používam Ramsey\uuid.
když v doctrine query buildru,který se dále předáva do Contributte\datagrid přidám left join.
Datagrid pak vypálí sql dotaz na tento styl:
SELECT ...... LEFT JOIN user ...
WHERE id IN ('8fa3e0fc-e99a-43ba-9de3-df96d285c5c1', 'c59388f9-98a4-4a08-bbf0-5e1e20b713db')
Jde o to, že id v databází je binary(16)
a tím pádem mi
to nevyhodí žádné záznamy, kvůli tomu, že Uuid se nepřevede na bity a
napíšou se v IN() jako string.
Pokud přepíšu metodu __toString() v Ramsey\uuid z ->getString na
->getBytes() tak to začne fungovat. Avšak musí existovat nějaký lepší
způsob, jak to vyřešit. Kdyby doctrine projela ty id metodou
convertToDatabaseValue() tak by to mělo být ok, avšak tato metoda se vůbec
nezovalá.
Id mám v entitě takto:
/**
* @var \Ramsey\Uuid\Uuid
*
* @ORM\Id
* @ORM\Column(type="uuid_binary", unique=true)
* @ORM\GeneratedValue(strategy="CUSTOM")
* @ORM\CustomIdGenerator(class="Ramsey\Uuid\Doctrine\UuidGenerator")
*/
private $id;
QueryBuilder
public function createQBForPostGrid() {
return $this->getEntityManager()->createQueryBuilder()->select(['p', 'u'])->from(Post::class, 'p')
->leftJoin('p.idUser', 'u');
}
config.neon
types:
uuid_binary:
class: Ramsey\Uuid\Doctrine\UuidBinaryType
commented: true
typesMapping:
enum: string
uuid_binary: binary
Používam nettrine s nette 3.
Budu vám moc vděčný za radu :D. Už se s tím trápím dost dlouho.
Editoval aliamjid (25. 7. 2019 17:48)
- akadlec
- Člen | 1326
Zkus tenhle patch, musel sem si jej udělat aby mě uuid správně konvertovalo
src/UuidBinaryType.php | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/src/UuidBinaryType.php b/src/UuidBinaryType.php
index e46cd2c..0951e75 100644
--- a/src/UuidBinaryType.php
+++ b/src/UuidBinaryType.php
@@ -68,7 +68,12 @@ class UuidBinaryType extends Type
try {
$uuid = Uuid::fromBytes($value);
} catch (InvalidArgumentException $e) {
- throw ConversionException::conversionFailed($value, static::NAME);
+ try {
+ $uuid = Uuid::fromString($value);
+
+ } catch (InvalidArgumentException $e) {
+ throw ConversionException::conversionFailed($value, static::NAME);
+ }
}
return $uuid;
@@ -95,7 +100,14 @@ class UuidBinaryType extends Type
return Uuid::fromString((string) $value)->getBytes();
}
} catch (InvalidArgumentException $e) {
- // Ignore the exception and pass through.
+ try {
+ $uuid = Uuid::fromBytes($value);
+
+ return $uuid->getBytes();
+
+ } catch (InvalidArgumentException $e) {
+ // Ignore the exception and pass through.
+ }
}
throw ConversionException::conversionFailed($value, static::NAME);