2011-02-01 7 views
2

私はPropelを初めて使用しており、ドキュメントを読んでいます。しかし、私は、EXISTSとNOT EXISTSの構文をSQLから明確に見分けることはできませんでした。たとえばLinqにはAny()があります。 「イディオム的な」Propelには次のものと同等のものがありますか? Propelの中に簡単になんとかですpropel相当の "exists"

SELECT 
    a.column1, 
    a.column2, 
    a.etc 
FROM 
    TableA a 
WHERE 
    (SELECT 
    COUNT(*) 
    FROM 
    TableB b 
    WHERE 
    b.someIdColumn = a.someIdColumn 
     AND 
    b.aNullableDateColumn IS NULL 
) > 0 

SELECT a.column1, a column2, a.etc 
FROM TableA a 
WHERE NOT EXISTS (SELECT 1 
        FROM TableB b 
        WHERE b.someIdColumn = a.someIdColumn 
        AND b.aNullableDateColumn IS NULL) 
+0

に含まれていないすべてのユーザーを選択しますが、 "適切な" を意味していましたか? (タイトル) – Trufa

+1

@トルファいいえ、Propel、ORM:http://www.propelorm.org/ – Andrew

+3

私の完全な無知を申し訳ありません!あなたが何を言っているのかわからない、それは私が編集しなかった理由です!それは恥ずかしいでしょう:P – Trufa

答えて

4

いくつかのより多くの掘削を行った後、私は現在入手可能であるように私は私の質問への答え、または少なくともとして良い答えを持っていると信じています。

EXISTSまたはNOT EXISTSの後に続くのはサブクエリです。その事実は明らかですが、サブクエリに関するヘルプの検索に焦点を当てるのは当初私には当てはまりませんでした。トピックについては、fewresourcesが見つかりました。基本的には、JOINを使用してクエリを書き直すか(@ Kaltasの回答の中心にあるように)、Criteria::CUSTOMを使用します。サブクエリを維持できるので、データベースのパフォーマンスを潜在的に助けてくれるので、2番目のオプションを好む可能性が高いと判断しました。

私は多くの読書をしましたが、約Criteria::CUSTOMでしたが、本当に私を助けた読書はPropel 1.5のソースを読んでいました。本当にシンプルです。ただ、そのままEXISTSと一緒に(データベースのテーブル名とカラム名、ないのPropelのオブジェクト名を使用して)、サブクエリを入れたりしないように、whereコールに存在する:それは簡単なことだ

TableAQuery::create() 
    ->where('NOT EXISTS (SELECT 1 FROM TableB WHERE TableA.someIdColumn = TableB.someIdColumn AND TableB.aNullableDateColumn IS NULL)') 
    ->find(); 

。内部的には、whereメソッドは、句を解釈するためのいくつかの可能性を調べ、一致するものが見つからない場合は、その句をCriteria::CUSTOMとして扱い、それをそのままSQLクエリに挿入します。だから、私はテーブルエイリアスを使うことができませんでした。

これまでに時間があった場合は、これを実行してパッチを提出するために、もっと「ORM-ish」の方法で作業します。しかし、誰かがそれに私を打ち負かすだろう。

uは今 Criteria::INCriteria::NOT_IN

例を使用することができたPropel 1.6の場合と同様に

0

は、私はあなたのようにクエリを書き直すことができると思います。

あるいはクリーナーとPropelの中で達成しやすい:

SELECT 
    a.column1, 
    a.column2, 
    a.etc 
FROM 
    TableA a 
    LEFT JOIN 
    TableB b ON (b.someIdColumn = a.someIdColumn) 
WHERE 
    b.aNullableDateColumn IS NULL 
    AND 
    b.primaryKeyColumn IS NOT NULL 
+0

あなたの答えをありがとう。私はそれが実行可能だろうと思うが、私は実際にこのコードを使用している状況のために少し良いものを見つけた。 – Andrew

+0

私はあなたの応答を見る - 手書きのSQLを使用している場合は、この場合にはOKですが、これは最も簡単で最速の方法です。 – Jan

0

:UserGroupに

$users = UserQuery::create()->filterById(
             UserPerUserGroupQuery::create()->select('user_id')->find(), CRITERIA::NOT_IN 
             ) 
          ->orderByUserName() 
          ->find(); 
関連する問題