[LWC]エラー「System.LimitException: Too many DML statements: 1」

SalesforceのLWC開発について

下記エラーが発生した時の原因と対策

「System.LimitException: Too many DML statements: 1」

原因と対策

結論:Apexで記述する更新処理のメソッドに、「(Cacheable=true)」をつけている。

解説:Apexで記述するメソッドをjavascriptで呼び出せるように@AuraEnabledというアノテーションをつけますね。その際、「@AuraEnabled(Cacheable=true)」こんな感じでオマケをつけることがあります。読みは「キャッシャブル」です。要するにキャッシュ可能ってことです。クライアント(画面)側にメソッドの結果をキャッシュしてあげることでパフォーマンスが良くなりますよというものですが、これはメソッドの中でデータの取得を行なっている場合のみ付けられます。作成・更新・削除処理にもかかわらず(Cacheable=true)」をつけていると、今回のエラーが出ます。

対策:「(Cacheable=true)」を外す。

簡単なコードを書きます。こういうときはつけられませんよという例です。

import {LightningElement, api} from 'lwc';
import updateAccountName from '@salesforce/apex/Example.updateAccountName';

export default class Example extends LightningElement {

   @api recordId;

   @wire(updateAccountName, {recordId:this.recordId})
   updateAccountName({ error, data }) {
       if (data) {
           console.log('success');
       } else {
           if(error){
               console.log('error');
           }
       }
   }
}
public with sharing class Example {

   // (Cacheable=true)があるのでエラー
   @AuraEnabled(Cacheable=true)
   public static void updateAccountName(String recordId){
       Account a = [SELECT Id, Name FROM Account WHERE id =: recordId];
       a.Name = 'new name';
       update a;
   }
}

おわります