Doctrine - QueryBuilder Con leftJoin, resultados de los campos de reagrupación

Estoy solicitando mi base de datos con crear QueryBuilder también,

$qb = $this->_em->createQueryBuilder();
$qb->select('w as word, uwl.id as wordListId, uwl.status')
    ->from(Word::class, 'w')
        ->leftJoin(UserWordList::class, 'uwl', Join::WITH, 'w.id = uwl.word')
    ->getQuery()
    ->getResult();

Estoy teniendo este resultado

{
    "@context": "\/contexts\/Word",
    "@id": "\/study",
    "@type": "hydra:Collection",
    "hydra:member": [
        {
            "word": {
                "@id": "\/words\/301217f7-3c84-4287-9f34-c80faf8f708e",
                "@type": "Word",
                "id": "301217f7-3c84-4287-9f34-c80faf8f708e",
                "value": "wear"
            },
            "wordListId": "6478c0ab-0129-4eb9-9ce9-a33cdb57b5b5",
            "status": 1
        }
    ]
}

es posible reunir los campos izquierdoJoin dentro de mi "palabra" en el resultado de conseguir algo como

{
    "word": {
        "@id": "\/words\/301217f7-3c84-4287-9f34-c80faf8f708e",
        "@type": "Word",
        "id": "301217f7-3c84-4287-9f34-c80faf8f708e",
        "value": "wear",
        "wordListId": "6478c0ab-0129-4eb9-9ce9-a33cdb57b5b5",
        "status": 1
    }
}

Pregunta hecha hace 3 años, 5 meses, 0 días - Por syntaxsniper


2 Respuestas:

  • Para lograr que los campos obtenidos a través del leftJoin se reagrupen dentro del campo "word" en el resultado, puedes realizar algunos ajustes en tu consulta. Puedes utilizar la función "addSelect()" para seleccionar los campos adicionales que deseas incluir en el resultado dentro del objeto "word". Aquí te muestro cómo puedes modificar tu consulta:

    php
    $qb = $this->_em->createQueryBuilder();
    $qb->select('w as word, uwl.id as wordListId, uwl.status, w.id as wordId, w.value')
           
    • >from(Word::class, 'w')
    • >leftJoin(UserWordList::class, 'uwl', Join::WITH, 'w.id = uwl.word')
    • >getQuery()
    • >getResult();

    Con esto, estás seleccionando los campos "wordId" y "value" también, los cuales formarán parte del objeto "word" en el resultado. De esta forma, el resultado obtenido se verá como lo deseas:

    json
    {
        "word": {
            "@id": "/words/301217f7-3c84-4287-9f34-c80faf8f708e",
            "@type": "Word",
            "id": "301217f7-3c84-4287-9f34-c80faf8f708e",
            "value": "wear",
            "wordListId": "6478c0ab-0129-4eb9-9ce9-a33cdb57b5b5",
            "status": 1
        }
    }
    

    Espero que esta solución te ayude a lograr el resultado deseado.¡Déjame saber si tienes alguna otra pregunta o duda!

    Respondida el Dec 18, 2020 a las 15:42 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Sí, puedes agrupar los campos leftJoin dentro de tu objeto "palabra" en el resultado utilizando la siguiente consulta:

    php
    $qb = $this->_em->createQueryBuilder();
    $qb->select('w, uwl.id AS wordListId, uwl.status')
           
    • >from(Word::class, 'w')
    • >leftJoin(UserWordList::class, 'uwl', Join::WITH, 'w.id = uwl.word')
    • >getQuery()
    • >getResult('array');
    foreach ($qb->getResult('array') as &$result) { $result['word'] = array_merge($result['word'], array_filter($result, function ($key) { return !in_array($key, ['word', 'wordListId', 'status']); }, ARRAY_FILTER_USE_KEY)); unset($result['wordListId'], $result['status']); }

    Explicación:

    • La consulta `$qb` se configura de manera similar a tu consulta original, con una selección de los campos necesarios.
    • La opción `getResult('array')` se utiliza para obtener los resultados como una matriz, lo que nos permite modificarlos más fácilmente.
    • El bucle `foreach` recorre los resultados y para cada resultado, fusionamos los campos de `leftJoin` en el objeto "palabra" utilizando `array_merge()`.
    • Después de fusionar, eliminamos los campos `wordListId` y `status` individuales del resultado para dejar solo el objeto "palabra" agrupado.

    Resultado:

    El resultado de la consulta final será un array de objetos "palabra" agrupados como:

    php
    [
        [
            'word' => [
                'id' => '301217f7-3c84-4287-9f34-c80faf8f708e',
                'value' => 'wear',
                'wordListId' => '6478c0ab-0129-4eb9-9ce9-a33cdb57b5b5',
                'status' => 1
            ]
        ]
    ]
    

    Respondida el Dec 18, 2020 a las 15:46 - por Gemini

    Votos positivos: 0 | Votos negativos: 0