Автор оригинала: David Wong.
Предисловие
Каждая начинающая обезьяна сталкивается с некоторыми странными проблемами, такими как необходимость запрашивать данные соответствующих реляционных таблиц в одной таблице в случае двух или более реляционных таблиц данных, как показано в следующих реляционных таблицах
Приготовиться
Описание таблицы Данных
- Таблица пользователей
- Форма членской карточки (vip)
- Расписание членских карточек (vip_fields)
Используйте сценарии
- Вы можете использовать требования к интерфейсу для запроса связанных полей нескольких таблиц в списке
требование
- Список Членских карточек
- Нужен членский ник/аватар/имя/пол адрес электронной почты/идентификатор участника
Осуществление
- Узнайте взаимосвязь между информацией о пользователе членства и данными расписания членской карточки на основе членской карточки. Есть два примера
Пример 1
- Результаты операции
{
"vip_id": 1,
"user_id": 1,
"user": {
"user_id": 1,
"Nickname": "Xiaobai".
"avatar": "http://xiaobai.png"
},
"fields": {
"vip_id": 1,
"Realname": "Xiao Xiaobai".
"sex": 1,
"email": "[email protected]"
}
},
{
"vip_id": 2,
"user_id": 2,
"user": {
"user_id": 2,
"Nickname": "Millet".
"avatar": "http://xiaobai.png"
},
"fields": {
"vip_id": 2,
"Realname": "millet".
"sex": 1,
"email": "[email protected]"
}
}
]Пример 2
offset(0)->limit(10)->asArray()->all();
// user ID
$userIds = array_unique(array_column($vips,'user_id'));
// membership card ID
$vipIds = array_unique(array_column($vips,'vip_id'));
// Membership Card User Information Data List
$users = User::find()->andWhere(['user_id'=>$userIds])->asArray()->limit(count($userIds))->all();
// Reorganization of membership card information data with user_id as key
$usersRow = array_column($users,null,'user_id');
// Membership Card Schedule Data List
$fields = VipFields::find()->andWhere(['vip_id'=>$vipIds])->asArray()->limit(count($vipIds))->all();
// Reorganization of membership card schedule data with vip_id as key
$fieldsRow = array_column($fields,null,'vip_id');
foreach($vips as &$row){
// User information for assembling membership cards does not exist as null
$row['user'] = $usersRow[$row['user_id']] ?? null;
// Assembled membership card schedule information does not exist as null
$row['fields'] = $fieldsRow[$row['vip']] ?? null;
}
return $vips;
?>- Результаты операции
{
"vip_id": 1,
"user_id": 1,
"user": {
"user_id": 1,
"Nickname": "Xiaobai".
"avatar": "http://xiaobai.png"
},
"fields": {
"vip_id": 1,
"Realname": "Xiao Xiaobai".
"sex": 1,
"email": "[email protected]"
}
},
{
"vip_id": 2,
"user_id": 2,
"user": {
"user_id": 2,
"Nickname": "Millet".
"avatar": "http://xiaobai.png"
},
"fields": {
"vip_id": 2,
"Realname": "millet".
"sex": 1,
"email": "[email protected]"
}
}
]отчет о событиях, произошедших после рассказываемого события
- Пример 1 запрашивает данные в каждом, частые запросы к базе данных, что приводит к большему давлению на базу данных, база данных запрашивает 1 + (N * 2) раз, что оказывает большее влияние на базу данных.
- Пример 2 После запроса основной таблицы членской карточки соответствующий идентификатор таблицы ассоциаций отдельно выводится в массив, а затем выполняется пакет запросов к списку, реорганизуется, и количество запросов к базе данных увеличивается в три раза.
резюме
Различные требования имеют различную логику обработки кода. Возьмем в качестве примеров пример 1 и Пример 2. Хотя пример 1 также может соответствовать требованиям к интерфейсу, он оказывает большее влияние на базу данных и не рекомендуется использовать. Пример 1 содержит больше этапов обработки, но оказывает меньшее влияние на данные. Можно использовать пример 2. Если будет найдено лучшее решение, оно будет продолжать оптимизироваться.
Оригинал: “https://developpaper.com/yii2-relational-data-table-assembly/”