sql >> データベース >  >> RDS >> Mysql

Doctrine QueryBuilder:複数のサブエンティティが一致する必要があるManyToOneリレーションシップ

    プレースホルダー:labelが原因で、ラベルと値を最後のフィルター値と一致させているため、正しく実行されていません。 、:value クエリで使用されるのはループの反復ごとに一意ではないため、ループによって生成されるすべての句は最後のラベルと値と一致します。

    各プロパティが提供されたフィルターと一致するジョブを取得するには、以下のドクトリンクエリのように記述できます。

    まず、すべてのラベルと値を別々の配列に収集し、次にIN()を使用してジョブのプロパティと照合します。 最後に、プロパティがすべてのフィルターに一致するジョブを取得するには、一致する結果をカウントするために集計を作成する必要があり、フィルターの数と同じである必要があります

    $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. SQLiteで指定された範囲内でランダムな数値を生成する方法

    2. タクシーサービスのデータベースモデル

    3. SQLデータベースにアラビア語を保存する

    4. PHPで一意のランダムな数値を生成する方法