sql >> Databáze >  >> RDS >> Mysql

Doctrine QueryBuilder:ManyToOne Relationship, kde se musí shodovat více než jedna dílčí entita

Neděláte to správně, porovnáváte štítky a hodnoty s posledními hodnotami filtru, protože zástupné symboly :label , :value použité v dotazu nejsou jedinečné pro každou iteraci smyčky, takže všechny klauzule generované smyčkou se budou shodovat s posledním štítkem a hodnotou.

Chcete-li získat úlohy, jejichž každá vlastnost odpovídá poskytnutým filtrům, můžete napsat něco jako dotaz na doktrínu níže.

Nejprve shromáždí všechny štítky a hodnoty do samostatného pole a poté se pomocí IN() přiřadí k vlastnostem úlohy operaci, nakonec získáte úlohy, jejichž vlastnosti odpovídají všem filtrům, které potřebujete k vytvoření agregace pro počítání odpovídajících výsledků a měla by se rovnat počtu filtrů

$qb =  $this->getDoctrine()
            ->getRepository('AppBundle:Job')
            ->createQueryBuilder('job')
            ->innerJoin('job.properties','p');
$labels = array();
$values = array();
foreach($filters as $label => $value)
{
    $labels[] = $label;
    $values[] = $value;
}
$qb->addSelect('COUNT(DISTINCT  p.id) AS total_properties')
   ->andWhere('p.label IN (:labels)')
   ->andWhere('p.value IN (:values)')
   ->addGroupBy('job.id')
   ->having('total_properties = '.count($filters))
   ->setParameter('labels',$labels)
   ->setParameter('values',$values)
   ->getQuery()
   ->getResult();



  1. Vytvoření dělené tabulky v SQL Server (T-SQL)

  2. Výchozí databáze s názvem postgres na serveru Postgresql

  3. (+) =operátor v Oracle SQL v klauzuli where

  4. Připojení PHP na Linuxu k Microsoft Access na Windows Share