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;
}
}
おわります