【问题标题】:Query won't return $belongs_many_many related object in Silverstripe 3.4在 Silverstripe 3.4 中查询不会返回 $belongs_many_many 相关对象
【发布时间】:2017-10-16 05:37:48
【问题描述】:

我有很多ArticlePages,它们可以出现在很多BlogPages 上,但是ArticlePage::get()->filter('BlogPage.ID', $parentID) 不会从数据库中返回预期的ArticlePages。

我检查了页面是否已发布,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);

【问题讨论】:

    标签: php silverstripe datamodel


    【解决方案1】:

    这对我有用

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

    BlogPageArticlePage 都是 SiteTree 的后代,因此需要更明确的表达式以避免结果查询中的命名冲突。

    Silverstripe 开发人员 TractorCow 告诉我 Silverstripe 3 映射查询的方式有一些限制,并给了我解决方法,但建议如果时间允许,可以进一步改进

    解释

    当 Silverstripe 3 为 SiteTree 的后代形成 SQL 查询时,它使用 SiteTree 表(和 SiteTree“作为别名”)。当->filter('BlogPage.ID') 添加到查询中时,Silverstripe 使用SiteTree 作为别名(再次)。这造成了引用冲突,并且没有匹配的记录。

    上面的->innerJoin()查询相关的BlogPage数据,并将其别名为BlogPage而不是SiteTree( ) 中的 $table 表达式是一个“循环”引用,它提供了我们可以更恰当地别名的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 2020-02-16
      • 2017-02-21
      相关资源
      最近更新 更多