Doctrine nezavolá se convertToDatabaseValue(). Problém s UUID

před 7 měsíci

aliamjid
Člen | 5
+
0
-

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)

před 3 měsíci

akadlec
Člen | 1324
+
0
-

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);