Рубрики
Uncategorized

Сборка таблицы реляционных данных YII2

Автор оригинала: David Wong.

Предисловие

Каждая начинающая обезьяна сталкивается с некоторыми странными проблемами, такими как необходимость запрашивать данные соответствующих реляционных таблиц в одной таблице в случае двух или более реляционных таблиц данных, как показано в следующих реляционных таблицах

Приготовиться

Описание таблицы Данных

  • Таблица пользователей
  • Форма членской карточки (vip)
  • Расписание членских карточек (vip_fields)

Используйте сценарии

  • Вы можете использовать требования к интерфейсу для запроса связанных полей нескольких таблиц в списке

требование

  • Список Членских карточек
  • Нужен членский ник/аватар/имя/пол адрес электронной почты/идентификатор участника

Осуществление

  • Узнайте взаимосвязь между информацией о пользователе членства и данными расписания членской карточки на основе членской карточки. Есть два примера

Пример 1

php
// Get membership card list
 $vips = Vip::find()->offset(0)->limit(10)->asArray()->all();
 // Circular assembly of membership user information and membership card scheduled data
 foreach($vips as &$row){
  // Access to membership card user information
     $row['user'] = User::find()->andWhre(['user_id'=>$row['user_id']])->limit(1)->asArray()->one();
  // Access to Membership Card Schedule Information
     $row['fields'] = VipFIelds::find()->andWhere(['vip_id'=>'vip_id'])->limit(1)->asArray()->one();
 }  
 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]"
        }
    }
]

Пример 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/”