Magento 2.1.1 OrderRepositoryオブジェクトを使用してIncrement IDで注文を読み込む方法


19

OrderRepositoryを使用して(IDの代わりに)増分IDを使用してOrderをロードするための最新のベストプラクティスは何ですか


2
重複していない -リンク答えは注文IDによって順序を取得する程度ではなく、インクリメントidである
ファビアンSchmengler

えっ!マークを重複として取り消す方法はありますか?私は、以下の答えを解決策の答えとしてマークするつもりでした。
frostshoxx

1
既に閉じられているため、遅すぎます。しかし、私は質問を再開するように指名しました。
ファビアンシュメングラー

回答:


32

Magento 2は、サービスコントラクトを使用してオブジェクトを取得および保存します。Magentoでは、このレイヤーはリポジトリーによって形成されます。リポジトリーは、管理者get()およびsave()メソッドです。これにより、ユーザーコードがモデルの呼び出しから離れます。モデルメソッド(load()save()などloadByIncrementId())を直接呼び出さないでください。これらのメソッドは、カスタムコードでサービスコントラクトを使用する必要があるため非推奨になっています。また、Khoaが示唆しているように、Magento内からAPIを使用しないでください。意味がありません。APIは、Magentoを他のシステムに接続するためのものです。

OrderRepositoryとSearchCriteriaBuilderをコンストラクターに挿入します。

private $orderRepository;
private $searchCriteriaBuilder;

public function __construct(
        \Magento\Framework\App\Helper\Context $context,
        \Magento\Sales\Model\OrderRepository $orderRepository,
        \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder
){
$this->orderRepository = $orderRepository;
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
parent::__construct($context);
}

そしてあなたの機能で:

$searchCriteria = $this->searchCriteriaBuilder
    ->addFilter('increment_id', '000000001', 'eq')->create();
$orderList = $this->orderRepository->getList($searchCriteria)->getItems();

// $orderList is now an array of Orders with this incrementId, which is just one order obviously

/** @var \Magento\Sales\Model\Order $order */
$order = $orderList[0];
// Your logic here
$order = $this->orderRepository->save($order);

magento.comの公式Magento PHP開発者ガイド

githubのMuldereaによるコード


次のようなエラーが表示されます:Magento \ Sales \ Model \ ResourceModel \ Order \ Collection型のオブジェクトを$ order = $ orderList [0]の配列として使用できません。
あるAshishラジ

それは奇妙だ、私は配列を得た。どのバージョンを使用していますか?しかし、コレクションであなただけ置き換えることができ$order = $orderList[0]$order = $orderList->getFirstItem()、コレクションから最初の(そして唯一の)アイテムを取得します。
ジャック

私はバージョン2.1.3です。そして、私は..私が行っている負荷支払オブジェクトのロード順序オブジェクトに必要$order = $orderList->getFirstItem(); $payment = $order->getPayment();しかし、中には何も得ていない$payment ここに私の問題を確認してくださいmagento.stackexchange.com/questions/158935/...
アシシュラジ

1
受け入れられた答えにバグがありました。これで解決しました。良い解決策をありがとう
CompactCode

:Magentoのでは私はこのよう順序を取得する必要があり2.3.x以降$order = $orderList['000000001'];
ph.dev

20

私の知る限り、を使用する必要があります\Magento\Sales\Api\Data\OrderInterface

/** @var \Magento\Sales\Api\Data\OrderInterfaceFactory $order **/

protected $orderFactory;

public function __construct(
    \Magento\Sales\Api\Data\OrderInterfaceFactory $orderFactory,
    ......
) {
    $this->orderFactory = $orderFactory;

}

増分IDによる注文オブジェクトの読み込み:

$this->orderFactory->create()->loadByIncrementId('00001952-42');

[編集]サービス契約を試してください。Jaccoの答えを試してください。


3
変数名にはアンダースコアを使用しないでください。PHPには、現在12歳であるPHP 5からアクセス修飾子があります。特にこちらの回答では、最新のプログラミング手法を使用する必要があります。
ジャック

1
この方法は、「機能する」場合でも使用しないでください。1つ:diインジェクションは共有オブジェクトであると指定されていない限り、共有オブジェクトです。OrderInterfaceを挿入するたびに、まったく同じオブジェクトを使用します。このルートに行きたい場合は、OrderInterfaceFactoryを使用してからcreate()を呼び出します。第二に、Jaccoの答えのようにサービス契約を使用する必要があります。
イアン

2
バージョン2.2.2、使用\Magento\Sales\Api\OrderRepositoryInterfaceとそのget()方法
-LucScu

2
サービス契約を考慮する必要があります。
チアゴ・リマ

1
@ThiagoLimaはい、私はあなたに同意しました!サービス契約の回答にも投票しました。
コアトゥオンディン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.