Silverstripe 使用write()更新的数据对象未反映在CMS中

Silverstripe 使用write()更新的数据对象未反映在CMS中,silverstripe,Silverstripe,我有一个类“listing”,它有以下字段: static $db = array( ... 'Left' => 'Varchar', 'Top' => 'Varchar' ... ); 我正在抓取这些以在地图上显示: function getListings(){ $sqlQuery = new SQLQuery(); $sqlQuery->

我有一个类“listing”,它有以下字段:

static $db = array(
            ...
            'Left' => 'Varchar',
            'Top' => 'Varchar'
            ...
    );
我正在抓取这些以在地图上显示:

function getListings(){
        $sqlQuery = new SQLQuery();
        $sqlQuery->setFrom('ListingCategory_Listings');
        $sqlQuery->selectField('STLC.Title AS cTitle, STLL.Title AS lTitle, Listing_Live.ID AS lID, ListingCategory.ID as cID, Phone, Email, Website, Filename, Top, Listing_Live.Left, STLC.ID AS catID');
        $sqlQuery->addLeftJoin('Listing_Live', '"ListingCategory_Listings"."ListingID" = "Listing_Live"."ID"');
        $sqlQuery->addLeftJoin('SiteTree_Live', '"Listing_Live"."ID" = "STLL"."ID"', 'STLL');
        $sqlQuery->addLeftJoin('ListingCategory', '"ListingCategory_Listings"."ListingCategoryID" = "ListingCategory"."ID"');
        $sqlQuery->addLeftJoin('SiteTree_Live', '"ListingCategory"."ID" = "STLC"."ID"', 'STLC');
        $sqlQuery->addLeftJoin('File', '"ListingCategory"."IconID" = "File"."ID"');
        $sqlQuery->addWhere('"Listing_Live"."ID" IS NOT NULL');
        $sqlQuery->setOrderBy('ListingCategory.ID', 'ASC');
        $result = $sqlQuery->execute();
        $dataObject = new ArrayList();
        foreach($result as $row) { 
            $dataObject->push(new ArrayData($row)); 
        }
        return $dataObject;
    }
我有一个函数来更新对象的左值和顶值(通过在前端拖放对象的实例通过AJAX激发):

这些肯定正在更新,正如页面刷新一样,对象反映了更新的顶部和左侧值,但是我在CMS中显示了这些字段,但它们在这里显示为空白。此外,当我将对象保存在CMS中时,左侧和顶部的值将被清除,我必须在前端重新定位它们

有人知道为什么会这样吗


更新:似乎write()只更新列表\u Live表,而不是列表表。如何让它在不使用原始SQL的情况下同时更新这两个表?

作为一个快速修复,我已将更新函数更改为:

function updatePoi(){
        $left = $_POST['left'];
        $top = $_POST['top'];
        $id = $_POST['ID'];
        DB::query('UPDATE "Listing" SET "Left"='.$left.', "Top"='.$top.' WHERE "ID"='.$id);
        DB::query('UPDATE "Listing_Live" SET "Left"='.$left.', "Top"='.$top.' WHERE "ID"='.$id);
        return 'success';
    }
我很高兴听到一个更整洁的方法来做这件事。

我建议使用

$poi->Top = $top;
$poi->write(); 
$poi->publish("Live", "Stage");
$poi->Top = $top;
$poi->write(); 
$poi->publish("Live", "Stage");