2012-05-14 14 views
1

を実行しました。このクエリは、実行時に問題なく動作します。しかし、私はZendのページネーションを使いたいので、クエリはアダプタを経由しなければなりません。Zend FrameworkはWHERE INクエリで

これを変換する必要があるクエリです。(私はこれだけ重要な部分はここにあるクエリを切ってきた私は、あなたがLOLこのクエリを実行することができないという事実を認識しています。)

//snip 
WHERE 
    city IN (
     SELECT 
      Plaatsnaam 
     FROM 
      plaatsnamen 
     WHERE 
      Latitude 
       BETWEEN 
        ? 
       AND 
        ? 
     AND 
      Longitude 
       BETWEEN 
        ? 
       AND 
        ?  
    ) 
//snip 

完璧に動作します!しかし、..あなたが見ることができるように、私は "高度な"どこの場合に使用しています。どういうわけか、私はこれを変換することはできませんし、私は立ち往生しています。私はここにフィットするいくつかの形式にクエリを変換する方法についてはまったくのドキュメントを発見していない

$db = Zend_Db_Table::getDefaultAdapter();     
$select = $db->select('gethousecity.id, city') 
           ->from('gethousecity') 
            ->join('houses_props', 'houses_props.id = gethousecity.id') 
           ->where('city IN()') // HOW TO CONVERT THE UPPER QUERY TO FIT IT HERE? 
           ->where('is_online = 1') 
           ->where('houses_props.prop_name = ?', 'something') 
           ->where('houses_props.prop_value BETWEEN ? AND ?', array(1,2)); 

これに変換する必要があるものです。誰にも分かりますか?ほとんどの場合、私はいくつかの値を挿入する必要があり、ZFはそこにいくつかの奇妙な変態を書き換えています。

私はちょっとちがいました。どんな助けも素晴らしいでしょう!

答えて

3

サブクエリがうまく動作してみてください。

->where('statement ? AND ?', array($val1, $val2) 

結果がこれでした。

$select1->cols('id')->where('date > NOW()'); 
$select2->where('id IN (?)', $select1); 

問題が複雑な場合は、名前付きパラメータを使用できます。

$select1 = $db->select(); 
$select2 = $db->select(); 
$select1->from('plaatsnamen', array('Plaatsnaam')) 
     ->where('Latitude BETWEEN :latmin AND :latmax') 
     ->where('Longitude BETWEEN :longmin AND :longmax'); 
$select2->from('gethousecity') 
     ->join('houses_props', 'houses_props.id = gethousecity.id') 
     ->where('city IN ?', $select1) // HOW TO CONVERT THE UPPER QUERY TO FIT IT HERE? 
     ->where('is_online = 1') 
     ->where('houses_props.prop_name = ?', 'something') 
     ->where('houses_props.prop_value BETWEEN :propsmin AND :propsmax'); 
die($select2); 

戻り値:

SELECT `gethousecity`.*, `houses_props`.* 
FROM `gethousecity` 
INNER JOIN `houses_props` ON houses_props.id = gethousecity.id 
WHERE 
    (city IN (
     SELECT `plaatsnamen`.`Plaatsnaam` 
     FROM `plaatsnamen` 
     WHERE 
     (Latitude BETWEEN :latmin AND :latmax) AND 
     (Longitude BETWEEN :longmin AND :longmax) 
    )) AND 
    (is_online = 1) AND 
    (houses_props.prop_name = 'something') AND 
    (houses_props.prop_value BETWEEN :propsmin AND :propsmax) 

manual

$bind = array(
    ':latmin' => 10, 
    ':latmax' => 3, 
    '...' => '...', 
); 
$db->fetchAll($select2, $bind); 
+0

はい、これらの単純な問題はありません。サブクエリがあるときではありません。 – ChrisH

+0

私の更新された回答を参照してください:) –

+0

さらに更新された:) –

0

私の知る限り、ZF DBにはサブクエリのネイティブサポートがありません。

あなたがこれを行うために試みることができる:

// snip 
->where("city IN (
    SELECT Plaatsnaam 
    FROM plaatsnamen 
    WHERE Latitude BETWEEN $lowLat AND $highLat 
     AND Longitude BETWEEN $lowLon AND $highLon 
)") 
// snip 

EDIT:直接条件文字列に値を補間する、これは(変数が信頼されている場合にのみ安全であるか、ユーザーからそれらを得た場合、これを行う前にフロートにキャストしてください)。

また、サブクエリを避けて、代わりに結合を実行することもできますが、パフォーマンスに影響が出る可能性があります(多分、良いか悪いか)。

+0

に見られるように、名前付きパラメータ、まあ、私もそのことを考えてきたで動作するはずです。ただし、動作しません。ZFはそのような奇妙な方法でクエリを書き換えます。http://pastebin.com/veCSzj6A – ChrisH

+0

@SiteSafeNL結果クエリを投稿できますか? –

+0

ええ、URLはhahaを貼り付けませんでした。 http://pastebin.com/veCSzj6A – ChrisH

0

結局のところ、すばやい回避策として、次のことを思いつきました。 $ db->見積もり。

$select = $db->select('gethousecity.id, city') 
            ->from('gethousecity') 
             ->join('houses_props', 'houses_props.id = gethousecity.id') 
            ->where('city IN ( 
                SELECT Plaatsnaam 
                FROM plaatsnamen 
                WHERE Latitude BETWEEN '.$latlon_search[0].' AND '.$latlon_search[1].' 
                 AND Longitude BETWEEN '.$latlon_search[2].' AND '.$latlon_search[3].' 
            )') 
            ->where('is_online = 1') 
            ->where('houses_props.prop_name = ?', 'vraagprijs[vraagprijs]') 
            ->where('houses_props.prop_value BETWEEN '.$db->quote($price_start).' AND '.$db->quote($price_end)); 

私にとっては、この作業を行う唯一の方法でした。たびに私がやった:

statement val1,val2 AND val1,val2 
0

この

$db = Zend_Db_Table::getDefaultAdapter(); 
    $selectInner = $db->select()->from('plaatsnamen','Plaatsnaam') 
        ->where("Lattitude BETWEEN $lowLat AND $highLat") 
        ->where("Longitude BETWEEN $lowLon AND $highLon") 
        ->__toString(); 



    $select = $db->select('gethousecity.id, city') 
            ->from('gethousecity') 
             ->join('houses_props', 'houses_props.id = gethousecity.id') 
            ->where("city IN ($selectInner)"); 
+0

安全性の問題については、varsを明確に引用する必要があります。 – ChrisH

関連する問題