根据密钥快速访问 ArrayDataProvider 中的模型?

问题描述 投票:0回答:1

我有一个

ArrayDataProvider
Items
,由以下形式的函数返回:

public function builder() {
  $items = Item::find()->all();
  $dataProvider = new ArrayDataProvider([
     'allModels'  => $items,
     'pagination' => false,
     'id'         => 'items_dp'
  ]);
  return $dataProvider;
}

由于各种原因,我需要这个函数的代码保持原样。

我的问题是,如果我有一个

Item
id
myItemIds
的列表,有什么方法可以在 DataProvider 中一一快速选择具有这些
Item
id
吗? 例如,在如下应用程序中:

$provider = builder();
$myItemIds = [112,321,422];
$superItems = [];
foreach ($myItemIds->each() as $itemId) {
  $superItem = // builder based on data from the Item in DataProvider with id = $itemId and other things;
  $superItems[] = $superItem;
}
php yii2
1个回答
0
投票

考虑到您的场景以及保持

builder
函数不变的约束,要在具有特定 ID (
Items
) 的
ArrayDataProvider
中选择
$myItemIds
,您需要迭代数据提供者的模型并检查是否项目的 ID 在您的 ID 列表中。以下是如何实现此目标的示例:

$provider = builder(); // Assuming this calls your builder function and returns an ArrayDataProvider
$myItemIds = [112, 321, 422];
$superItems = [];

// Get all models from the provider
$allModels = $provider->allModels;

// Iterate through the list of IDs you want to find
foreach ($myItemIds as $itemId) {
    // Search for the item by ID in the array of all models
    $key = array_search($itemId, array_column($allModels, 'id'));
    if ($key !== false) {
        // If the item is found, you can process it as needed
        $item = $allModels[$key];
        // Assuming you have some logic to build a "super item" from an item
        $superItem = // Your logic to transform $item into $superItem goes here;
        $superItems[] = $superItem;
    }
}

// Now $superItems contains your processed items

此代码片段假设

$allModels
包含一个对象数组,其中每个对象都有一个
id
属性,您可以将其与所需项目 ID 列表进行比较 (
$myItemIds
)。
array_search
函数与
array_column
配合使用,可以根据ID在所有模型的数组中查找每一项的索引。一旦找到某个项目,您就可以根据需要对其进行处理,并将结果添加到
$superItems
数组中。

注意:此方法假设

id
字段可在项目对象上直接访问,并且
$allModels
是一个简单的对象数组。如果您的实际数据结构不同,您可能需要相应调整搜索逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.