LWCでSalesforceのレコード情報を取得する方法まとめ
Lightning Web Components (LWC) では、Salesforceのレコード情報を取得する方法がいくつかあります。
今回は、「同じ Account レコードの Name を取得する」 というテーマで
①標準コンポーネント
②Apex呼び出し(Imperative / @wire)
③標準API
でのデータ取得の比較を行います。
1. 標準コンポーネント(lightning-record-form)
// js
import { LightningElement } from 'lwc';
import NAME_FIELD from '@salesforce/schema/Account.Name';
export default class AccountViewerForm extends LightningElement {
recordId = '001XXXXXXXXXXXXXXX';
fields = [NAME_FIELD];
}
<template>
<lightning-card title="③ 標準コンポーネント">
<lightning-record-form
record-id={recordId}
object-api-name="Account"
fields={fields}
mode="view">
</lightning-record-form>
</lightning-card>
</template>
2. 標準API(UI API:getRecord + getFieldValue)
Salesforce 標準の UI API を使ってデータを直接取得可能。
少ないコード量で実装でき、権限や共有ルールが自動で適用され安全。
getRecord / getFieldValue
import { getRecord, getFieldValue } from 'lightning/uiRecordApi';
import { wire } from 'lwc';
import NAME_FIELD from '@salesforce/schema/Account.Name';
@wire(getRecord, { recordId: '$recordId', fields: [NAME_FIELD] })
recordId = '001XXXXXXXXXXXXXXX';
@wire(getRecord, { recordId: '$recordId', fields: [NAME_FIELD] })
account;
get accountName() {
return getFieldValue(this.account.data, NAME_FIELD);
}
- メリット: セキュリティ考慮が自動で効く / 単純なレコード表示に最適
- デメリット: 複雑な検索や条件分岐はできない
3. Apexで呼び出し
最も柔軟な方法です。SOQLを使った複雑な検索や、サーバーサイドでのビジネスロジックを組み込みたい場合に利用します。
1-1 Imperative(命令型)呼び出し
import { LightningElement } from 'lwc';
import getAccount from '@salesforce/apex/AccountController.getAccount';
export default class AccountViewerApexImperative extends LightningElement {
recordId = '001XXXXXXXXXXXXXXX';
accountName;
// Imperative 呼び出しは メソッドの中で呼ぶ必要がある
connectedCallback() {
this.loadAccount();
}
getAccount({ recordId: this.recordId })
.then(result => {
this.accountName = result.Name;
})
.catch(error => {
console.error(error);
});
}
}
// html
<template>
<lightning-card title="Apex(Imperative)">
<p>Account Name: {accountName}</p>
</lightning-card>
</template>
- メリット: 任意タイミングで取得(ボタンクリック時などに便利)
- デメリット: リアクティブ(自動更新)にはならない
@wire(リアクティブ呼び出し)
// apex
public with sharing class AccountController {
@AuraEnabled(cacheable=true)
public static Account getAccount(Id recordId) {
return [SELECT Id, Name FROM Account WHERE Id = :recordId LIMIT 1];
}
}
// js
import { LightningElement, wire } from 'lwc';
import getAccount from '@salesforce/apex/AccountController.getAccount';
export default class AccountViewerApexWire extends LightningElement {
recordId = '001XXXXXXXXXXXXXXX';
account;
@wire(getAccount, { recordId: '$recordId' })
wiredAccount({ error, data }) {
if (data) {
this.account = data;
} else if (error) {
console.error(error);
}
}
get accountName() {
return this.account ? this.account.Name : '';
}
}
<template>
<lightning-card title="Apex(@wire)">
<p>Account Name: {accountName}</p>
</lightning-card>
</template>
- メリット: 引数が変わると自動で再取得される
- デメリット: 引数を柔軟に扱いにくい
4. data.field.value と getFieldValue(record, field) の違い
4-1. data.fields.項目名.value
getRecord の結果オブジェクトから、直接フィールド値を参照する書き方。
this.contact.data.fields.Name.value
- 特徴: 直接アクセスできるが、ネストが深くなりがち
- デメリット: undefined チェックを自分で書く必要がある
4-2. getFieldValue(record, field)とは?
import { getFieldValue } from 'lightning/uiRecordApi';
import NAME_FIELD from '@salesforce/schema/Contact.Name';
get name() {
return getFieldValue(this.contact.data, NAME_FIELD);
}
record: getRecord で取得したレコードオブジェクト
field: 項目のAPI名(文字列 or @salesforce/schema でimportしたもの)
特徴
- ネストを意識せず、値をシンプルに取得できる
- 最大5レベルの参照関係をサポート
- 単純にアクセスするだけ → data.fields.Name.value
- 安全で見やすく、参照関係も扱う → getFieldValue(record, field) を推奨
✅ まとめ:使い分けの目安
単純にレコード取得・表示 → LDS (getRecord, lightning-record-form)
検索や複雑な条件付き取得 → Apex (imperative / @wire)
方法 | 代表例 | 特徴 | 向いているケース |
---|---|---|---|
① 標準API |
getRecord + getFieldValue
|
宣言的・セキュリティ自動適用・推奨 | 基本的なレコード取得 |
② Apex(@wire / Imperative) |
@AuraEnabled メソッド |
SOQL可・柔軟・ビジネスロジックも実装可 | 複雑な検索や条件分岐が必要 |
③ 標準コンポーネント | lightning-record-form |
UI込み・最小コード | シンプルに表示/編集だけしたい |
7.参考資料