Yii2 Используя ArrayHelper :: map, вернуть дочерний элемент по третьему параметру - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть две таблицы с основной деталью дизайна.

Основная таблица называется Format2006FlatFileMaster.

Подробная таблица называется Format2006FlatFileDetail.

Моя цельЯ хочу использовать поле в качестве ключа, и значение является их потомком мастера.

Я имею в виду, как это

$details = ArrayHelper::map(Format2006FlatFileMaster::find()->all(), 'alias', function ($model) {
        $model->format2006FlatFileDetails;
});

Я получил, как эти данные, (Например, этофиктивные данные)

'details' => [
    'HDR01' => [
        0 => app\models\utilities\Format2006FlatFileDetail#1
        (
            [yii\db\BaseActiveRecord:_attributes] => [
                'id' => 1
                '2006_flat_file_master_id' => 1
                'field_name' => 'Record Lable'
                'start' => 1
                'width' => 5
                'decimal' => null
                'type' => 'C'
                'mandatory' => 'Y'
                'note' => 'HDR01'
            ]
            [yii\db\BaseActiveRecord:_oldAttributes] => [
                'id' => 1
                '2006_flat_file_master_id' => 1
                'field_name' => 'Record Lable'
                'start' => 1
                'width' => 5
                'decimal' => null
                'type' => 'C'
                'mandatory' => 'Y'
                'note' => 'HDR01'
            ]
            [yii\db\BaseActiveRecord:_related] => []
            [yii\db\BaseActiveRecord:_relationsDependencies] => []
            [yii\base\Model:_errors] => null
            [yii\base\Model:_validators] => null
            [yii\base\Model:_scenario] => 'default'
            [yii\base\Component:_events] => []
            [yii\base\Component:_eventWildcards] => []
            [yii\base\Component:_behaviors] => []
        )
        1 => app\models\utilities\Format2006FlatFileDetail#2
        (
            [yii\db\BaseActiveRecord:_attributes] => [
                'id' => 2
                '2006_flat_file_master_id' => 1
                'field_name' => 'Message Function Code'
                'start' => 6
                'width' => 1
                'decimal' => null
                'type' => ''
                'mandatory' => 'Y'
                'note' => '1 Original 2 Update (handle manually) 3 Consolidation (handle manually)'
            ]
            [yii\db\BaseActiveRecord:_oldAttributes] => [
                'id' => 2
                '2006_flat_file_master_id' => 1
                'field_name' => 'Message Function Code'
                'start' => 6
                'width' => 1
                'decimal' => null
                'type' => ''
                'mandatory' => 'Y'
                'note' => '1 Original 2 Update (handle manually) 3 Consolidation (handle manually)'
            ]
            [yii\db\BaseActiveRecord:_related] => []
            [yii\db\BaseActiveRecord:_relationsDependencies] => []
            [yii\base\Model:_errors] => null
            [yii\base\Model:_validators] => null
            [yii\base\Model:_scenario] => 'default'
            [yii\base\Component:_events] => []
            [yii\base\Component:_eventWildcards] => []
            [yii\base\Component:_behaviors] => []
        )
    ]
]

Как видите, данные по третьему параметру находятся в объектах массива, мне нужен формат массива, подобный этому.

'details' => [
    'HDR01' => [
        0 => [
            'id' => 1
            '2006_flat_file_master_id' => 1
            'field_name' => 'Record Lable'
            'start' => 1
            'width' => 5
            'decimal' => null
            'type' => 'C'
            'mandatory' => 'Y'
            'note' => 'HDR01'
        ],
        1 => [
            'id' => 2
            '2006_flat_file_master_id' => 1
            'field_name' => 'Message Function Code'
            'start' => 6
            'width' => 1
            'decimal' => null
            'type' => ''
            'mandatory' => 'Y'
            'note' => '1 Original 2 Update (handle manually) 3 Consolidation (handle manually)'
        ]
    ]
]

Пожалуйста, сообщите.

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Вам нужно использовать ArrayHelper::toArray() для преобразования объекта в массив:

$details = ArrayHelper::map(Format2006FlatFileMaster::find()->all(), 'alias', function ($model) {
    return ArrayHelper::toArray($model->format2006FlatFileDetails);
});
0 голосов
/ 18 ноября 2018

вы можете решить эту проблему, объявив новый метод отношения в вашем Format2006FlatFileMaster с именем format2006FlatFileDetailsAsArray, и этот метод будет иметь asArray, asArray ответ для отношения будет извлечен в виде массива, как выхотите.

или другим способом: вы можете использовать Join / JoinWith в запросе, вложенном в использование отношения модель->, таким образом вы можете установить asArray direct и получить массив тоже ... например:

$query = yourModel::find()
   ->joinWith([....])
   ->andWhere(....)
   ->asArray()->all();

Примечание: Вы можете также протестировать Format2006FlatFileMaster::find()->asArray()->all(), возможно, это тоже решит вашу проблему, но я не уверен.

С уважением,

...