2017-05-16 11 views
1

に$ belongs_many_many関連するオブジェクトを返しません、私は多くのBlogPageの上に表示することができ、多くのArticlePage Sを、持っていますが、データベースから期待されるArticlePageArticlePage::get()->filter('BlogPage.ID', $parentID)返しません。クエリSilverstripe 3.4

ページが公開されており、BlogPage_ArticlePagesテーブルの関係が正しく保存されていることを確認しました。

BlogPage.php

class BlogPage extends Page { 
    ... 

    private static $many_many = array(
     'ArticlePages' => 'ArticlePage' 
    ); 

    ... 
} 

ArticlePage.php

class ArticlePage extends Page { 
    ... 
    private static $belongs_many_many = array(
     'BlogPages' => 'BlogPage' 
    ); 
    ... 
} 

リスト/クエリ

$parentID = 12; 
ArticlePage::get()->filter('BlogPages.ID', $parentID); 

答えて

2

これは私のために働い

$parentID = 12; 
$query = ArticlePage::get()->innerJoin(
    $table = '(SELECT "BlogPage_ArticlePages"."ArticlePageID" FROM "BlogPage_ArticlePages" INNER JOIN "BlogPage" ON "BlogPage_ArticlePages"."BlogPageID" = "BlogPage"."ID" WHERE "BlogPage"."ID" = ?)', 
    $onClause = '"BlogPage"."ArticlePageID" = "SiteTree"."ID" ', 
    $alias = "BlogPage", 
    $order = 20, 
    $parameters = array($parentID) 
); 

BlogPageArticlePageSiteTreeの両方の子孫であるので、より明示的な表現は、結果のクエリで名前の競合を避けるために必要とされます。

Silverstripe開発者TractorCowは道Silverstripe 3マップクエリはいくつかの制限があることを教えてくれましたし、私の回避策、を与えたが、時間がを許可された場合、これはさらに改善される可能性が示唆されました。

説明

Silverstripe SiteTreeの子孫3つの形のSQLクエリは、それが( "別名として" とSiteTreeSiteTreeテーブルを使用します。クエリに->filter('BlogPage.ID')が追加されると、Silverstripeは別名としてSiteTreeを使用します(もう一度)。これにより参照競合が発生し、レコードは一致しません。

上記の->innerJoin()は、BlogPageというデータを照会し、SiteTreeの代わりにBlogPageというエイリアスを付けます。 ()内の$table式は、より適切なエイリアスを提供する「循環型」リファレンスです。

関連する問題