Yii2中如何用Elasticsearch的mget()获取ActiveRecord格式数据?
Yii2 Elasticsearch ActiveRecord 多文档获取与AR对象转换
问题1:能否用mget直接获取AR对象?
原生的yii\elasticsearch\ActiveRecord::mget()方法确实只会返回原始文档数组,没有直接返回AR对象的默认选项。但你可以在自己的Elasticsearch AR模型里封装一个自定义方法,借助Yii提供的AR实例化和数据填充能力实现:
use yii\elasticsearch\ActiveRecord; class YourEsModel extends ActiveRecord { // ... 模型原有配置与方法 public static function mgetAsAr(array $ids) { // 调用原生mget接口获取文档数组 $docs = static::mget(['body' => ['ids' => $ids]]); $arInstances = []; foreach ($docs['docs'] as $doc) { if (!empty($doc['found'])) { // 创建AR实例并填充文档数据 $model = static::instantiate($doc['_source']); static::populateRecord($model, $doc['_source']); // 设置文档主键与索引元信息 $model->setPrimaryKey($doc['_id']); $model->index = $doc['_index']; $model->type = $doc['_type']; // ES7+版本可固定为'_doc' $arInstances[] = $model; } } return $arInstances; } }
调用时直接使用YourEsModel::mgetAsAr(['id1', 'id2'])即可得到AR对象数组。
问题2:能否将文档数组转为AR对象适配ActiveDataProvider?
完全可以,只需将文档数组逐个转换为AR实例,再传入数据提供者即可(推荐用ArrayDataProvider适配内存数组数据源):
转换与数据提供者构建示例
// 假设$docs是mget返回的原始文档数组 $docs = YourEsModel::mget(['body' => ['ids' => ['id1', 'id2', 'id3']]]); $arModels = []; foreach ($docs['docs'] as $doc) { if ($doc['found']) { $model = YourEsModel::instantiate($doc['_source']); YourEsModel::populateRecord($model, $doc['_source']); $model->setPrimaryKey($doc['_id']); $arModels[] = $model; } } // 构建适配ListView的DataProvider $dataProvider = new \yii\data\ArrayDataProvider([ 'allModels' => $arModels, 'pagination' => [ 'pageSize' => 10, ], 'sort' => [ 'attributes' => ['title', 'created_at'], // 根据模型实际字段配置 ], ]);
之后将$dataProvider传入ListView组件即可,用法与常规AR数据提供者完全一致。
注意事项
- 必须过滤
found字段为false的条目,避免生成无效AR实例; - ES7+版本中
_type字段默认值为_doc,可根据索引配置调整。
内容的提问来源于stack exchange,提问作者The Bndr
相关产品推荐
相关产品推荐

