0

値が含まれる場合と含まれない場合があるルートがあり、それに基づいてDoctrineにクエリを実行したい、

 /**
 * @Route("/{productType}/{region}/{town}/{road}", name="product_type" , defaults={"productType" = null , "region" = null , "town" = null , "road" = null  })
 * @Template()
 */
public function productTypeAction($productType, $region , $town , $road)
{       
    $properties = $this->getDoctrine()
    ->getRepository('MyBundle:Product')
    ->findBy(
    array('productType' => $productType,
          'region' => $region,
          'town' => $town,            
          'road' => $road               
    ),
    array('id' => 'ASC'));    



    return 'mytwig';
}

たとえば、次のようになります。

http://localhost/book/england/london/streetroad

Region of England 、 London の町、 Streetroad の道路を含む Books をクエリします。

ルート:

http://localhost/book

Books を照会し、すべての本を返す必要があります。

代わりに、現在は単に querinyg です:

t0.productid = ? 
  AND t0.region IS NULL 
  AND t0.town IS NULL      
  AND t0.road IS NULL 

これは理にかなっていますが、必要な結果を得るための最良の方法は何ですか? または、DQL を元に戻す必要がありますか?

4

2 に答える 2

2

array_filterを使用して、配列から NULL 値を削除します。

->findBy(array_filter(array(
      'productType' => $productType,
      'region' => $region,
      'town' => $town,            
      'road' => $road               
), 'is_null'),
于 2013-05-23T17:28:08.323 に答える
0

次のようなことができます。

// ...

$filters =  array(
      'productType' => $productType,
      'region'      => $region,
      'town'        => $town,            
      'road'        => $road               
);
foreach ( $filters as $key => $value) {
    if ($filters[$key] === null) { 
        unset($filters[$key]); 
    }
}

// ...

    ->findBy($filters),

// ...   

または配列フィルターを使用した短い形式:

->findBy(
      array_filter(
          array(
              'productType' => $productType,
              'region' => $region,
              'town' => $town,            
              'road' => $road               
           ),
           'is_null'
      )
  )
于 2013-05-23T17:08:35.990 に答える