2017-05-16 2 views
1

J'ai beaucoup ArticlePage s, qui peuvent apparaître sur de nombreux BlogPage s, mais ArticlePage::get()->filter('BlogPage.ID', $parentID) ne retourne pas les attendus ArticlePage s de la base de données.

J'ai vérifié que les pages sont publiées et la table BlogPage_ArticlePages a la relation stockée correctement.

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' 
    ); 
    ... 
} 

La liste/requête:

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

Répondre

2

Cela a fonctionné pour moi:

$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) 
); 

BlogPage et ArticlePage sont les descendants de SiteTree, donc une expression plus explicite est nécessaire pour éviter les conflits de noms dans la requête résultant.

développeur Silverstripe TractorCow m'a informé que la façon dont Silverstripe 3 requêtes de cartes a des limites, et m'a donné la solution de contournement, mais il a suggéré cela pourrait être encore améliorée si le temps a permis.

Explication:

Lorsque les formes Silverstripe 3 une requête SQL pour les descendants de SiteTree, il utilise la table SiteTree (et SiteTree "comme alias"). Lorsque le ->filter('BlogPage.ID') est ajouté à la requête, Silverstripe utilise SiteTree en tant qu'alias (à nouveau). Cela a créé un conflit de référence et aucun enregistrement ne correspond.

Les ->innerJoin() requêtes ci-dessus les données pertinentes BlogPage, et alias que BlogPage au lieu de SiteTree. L'expression $table dans le () est une référence "cyclique", qui fournit quelque chose que nous pouvons alias de façon plus appropriée.