у меня много ArticlePage
с, которые могут появиться на многих BlogPage
с, но ArticlePage::get()->filter('BlogPage.ID', $parentID)
не возвращает ожидаемое ArticlePage
с из базы данных.
Я проверил, что страницы опубликованы, и 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);
Это сработало для меня:
$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
а также ArticlePage
оба являются потомками SiteTree
поэтому требуется более явное выражение, чтобы избежать конфликтов имен в результирующем запросе.
Разработчик Silverstripe TractorCow сообщил мне, что способ отображения запросов Silverstripe 3 имеет некоторые ограничения, и дал мне обходной путь, но предположил, что это может быть улучшено, если время позволит.
объяснение:
Когда Silverstripe 3 формирует запрос SQL для потомков SiteTree
, он использует SiteTree
стол (и SiteTree
«как псевдоним»). Когда ->filter('BlogPage.ID')
добавлен в запрос, Silverstripe использует SiteTree
как псевдоним (снова). Это создало конфликт ссылок, и ни одна запись не была найдена.
->innerJoin()
выше запросы соответствующие BlogPage
данные и псевдонимы как BlogPage
вместо SiteTree
, $table
выражение в ( )
является «циклической» ссылкой, которая предоставляет то, что мы можем использовать для псевдонима более подходящим образом.
Других решений пока нет …