如何使用ORM而不是原始SQL查询更新值?

时间:2016-09-05 10:22:46

标签: silverstripe

当用户想要设置要显示的图像时,我们希望将所有其他图像重置为featured。我使用以下原始SQL查询工作。

使用ORM是否有更简洁的方法可以做到这一点,或者对于这种类型的东西是否更清洁以保持原样?

<?php

class Banner extends DataObject {
    private static $db = array(
        'FeaturedImage' => 'Boolean'
    );

    private static $has_one = array(
        'Image' => 'Image'
    );

    private static $summary_fields = array(
        'Image.CMSThumbnail' => 'Image',
        'FeaturedImage.Nice' => 'Featured?'
    );

    public function onBeforeWrite()
    {
        parent::onBeforeWrite();

        // When user sets an image to be featured, reset all other images not to be featured
        if ($this->FeaturedImage) {
            $query = 'UPDATE Banner SET FeaturedImage = 0 WHERE Banner.ID !=' . $this->ID;
            DB::query($query);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

您是否已经尝试过此操作(抱歉,无法将其添加为评论)?

public function onAfterWrite()
{
    parent::onAfterWrite();

    if ($this->FeaturedImage) {
        $banners = Banner::get()->exclude('ID', $this->ID);
        foreach($banners as $banner) {
           $banner->FeaturedImage = false;
           $banner->write();
        }
    }
}

该条件应该阻止写入的递归调用。

答案 1 :(得分:1)

类似的东西:

$banners = Banner::get()->exclude('ID', $this->ID);
foreach($banners as $banner) {
   $banner->FeaturedImage = 0;
   $banner->write();
}