sql >> Database teknologi >  >> RDS >> Mysql

Er det muligt at bruge resultatet af en SQL-funktion som et felt i Doctrine?

Du kan kortlægge en enkelt kolonneresultat til et enhedsfelt - se på native forespørgsler og ResultSetMapping at opnå dette. Som et simpelt eksempel:

use Doctrine\ORM\Query\ResultSetMapping;

$sql = '
    SELECT p.*, COUNT(r.id)
    FROM products p
    LEFT JOIN reviews r ON p.id = r.product_id
';

$rsm = new ResultSetMapping;
$rsm->addEntityResult('AppBundle\Entity\Product', 'p');
$rsm->addFieldResult('p', 'COUNT(id)', 'reviewsCount');

$query   = $this->getEntityManager()->createNativeQuery($sql, $rsm);
$results = $query->getResult();

Så i din produktenhed ville du have en $reviewsCount felt, og antallet vil blive afbildet til det. Bemærk, at dette kun virker, hvis du har en kolonne defineret i Doktrinens metadata, som f.eks.:

/**
 * @ORM\Column(type="integer")
 */
private $reviewsCount;

public function getReviewsCount()
{
    return $this->reviewsCount;
}

Dette er, hvad der foreslås af Samlede felter Doktrin dokumentation. Problemet er her, at du i bund og grund får Doctrine til at tro, at du har en anden kolonne i din database kaldet reviews_count , hvilket er hvad du ikke ønsker. Så dette vil stadig fungere uden at tilføje den kolonne fysisk, men hvis du nogensinde kører en doctrine:schema:update det vil tilføje den kolonne til dig. Desværre tillader Doctrine ikke virkelig virtuelle egenskaber, så en anden løsning ville være at skrive din egen brugerdefinerede hydrator eller måske abonnere på loadClassMetadata hændelse og tilføj selv tilknytningen manuelt, efter din specifikke enhed (eller entiteter) er indlæst.

Bemærk, at hvis du gør noget som f.eks. COUNT(r.id) AS reviewsCount så kan du ikke længere bruge COUNT(id) i din addFieldResult() funktion, og skal i stedet bruge aliaset reviewsCount for den anden parameter.

Du kan også bruge ResultSetMappingBuilder som en start på at bruge resultatsæt-kortlægningen.

Mit egentlige forslag er at gøre dette manuelt i stedet for at gennemgå alle de ekstra ting. Opret i det væsentlige en normal forespørgsel, der returnerer både din enhed og dine skalære resultater til en matrix, og indstil derefter det skalære resultat til et tilsvarende, ikke-tilknyttet felt på din enhed, og returner entiteten.



  1. Hvordan installerer jeg kun klientværktøjerne til PostgreSQL på Windows?

  2. Hvordan kan jeg rydde en transaktions-deadlock?

  3. Hvordan kombinerer man samlede funktioner i MySQL?

  4. Forespørgselsoptimering i PostgreSQL. FORKLAR Grundlæggende – Del 3