2017-02-20 12 views
1

私はSilverStripe ORMを使用しています。SilverStripe ORMでサブクエリ、グループ、および有する

私は、少なくとも所望の(劣ら)専門ないのALLにあるすべての企業を取得する必要があります:

class CompanyPage extends Page {  
    private static $many_many = [ 
     "Specializings" => "Specializing", 
    ]; 
} 

class Specializing extends DataObject { 
    private static $belongs_many_many = [ 
     "CompanyPages" => "CompanyPage", 
    ]; 
} 

私はIDS($ specIds)を専門と希望でいっぱいの配列を持っています。
これは、少なくとも1つの専門分野にある企業を取得しますが、必要なものではありません。

$companyPages = CompanyPage::get()->filter([ 
    "Specializings.ID:ExactMatch" => $specIds, 
]); 

私は、このSQLクエリ

select * from CompanyPage c1 join (
    select c.ID from CompanyPage c 
    join CompanyPage_Specializings cs on cs.CompanyPageID = c.ID 
    where cs.SpecializingID in (14,15) 
    group by c.ID having count(c.ID) = 2 
) c2 on c1.ID = c2.ID 

と私のタスクをachiveすることができますしかし、私はそれがSilverStripe ORMでどのようにachiveことができますか?
私はあなたがSilverStripeに、より複雑なDBのクエリを構築するためのSQLQueryを使用するかは、RAW SQLを実行したい場合は、DBを使用することができますORM

答えて

2

に集約関数で持っていることについて何かを見つけることができません:クエリ()

https://docs.silverstripe.org/en/3/developer_guides/model/sql_query/

これらの両方を使用すると、コードを反復したときに、この

foreach($results AS $result){ 
    $varname = $results['propertyname']; 
} 

ラースのようなものを使用する意味SS_ListではなくMySQLResultSetを返します。あなたがストレートSS ORMを使用した場合、以下よりも

foreach($results AS $result){ 
    $varname = $results->propertyname; 
} 

あなたはMysqlResultとは、それはあなたがあなたのテンプレートで使用するか、またはその代わりに、あなたがこのモジュールを使用する場合だけ覚えておいてください(SS_ListにMySQLResultSetを変換するために、このモジュールを使用することができますArrayListのを構築することによって、あなたが反復可能性が設定したらそのストレートORMから得られる関係利益は維持されません - 例えば、$ has_one関係など)。

https://github.com/burnbright/silverstripe-sqlquerylist

私はこのことができます願っています。

+0

ありがとうございました。 DB:クエリは今のところ動作します。 – FlamyTwista

関連する問題