За последние 24 часа нас посетил 7681 программист и 654 робота. Сейчас ищут 119 программистов ...

Привязка к базовой таблице с упором на цикл

Тема в разделе "PHP для профи", создана пользователем Вероломство, 7 апр 2021.

  1. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    358
    Симпатии:
    12
    Решил разгрузить БД от лишних записей: на данный момент данные базовой таблицы тупо переносятся в таблицу пользователя, поэтому хочу в таблице пользователя хранить ТОЛЬКО пару - айдишник пользуна, айдишник базовой таблицы ну и количество там у меня ещё есть.

    PHP:
    1. <?php
    2.  
    3.  
    4. namespace app\models\admin;
    5.  
    6.  
    7. use core\base\Model;
    8. use core\Data;
    9.  
    10. class Unit extends Model
    11. {
    12.     public $user_lvl;
    13.     public $name;
    14.     public $type;
    15.     public $kind;
    16.     public $attack;
    17.     public $defense;
    18.     public $maintenance;
    19.     public $price;
    20.  
    21.     public static function getFromOne($unit_id)
    22.     {
    23.         $unit = Data::get('admin.unit'); // проверили наличие одного в "памяти"
    24.  
    25.         if (!$unit) {
    26.             $unit = self::findOne($unit_id); // выбираем один по айдишнику
    27.  
    28.             Data::set('admin.unit', $unit); // сохраняем один в "память"
    29.         }
    30.  
    31.         return $unit; // вернули один из одного
    32.     }
    33.  
    34.     public static function getFromAll($unit_id)
    35.     {
    36.         $unit = Data::get('admin.unit'); // проверили наличие всех в "памяти"
    37.  
    38.         if (!$unit) {
    39.             $unit = self::findAll(); // выбираем все
    40.  
    41.             Data::set('admin.unit', $unit); // сохраняем все в "память"
    42.         }
    43.  
    44.         return array_column($unit, null, 'id')[$unit_id]; // вернули один из всех
    45.     }
    46. }

    PHP:
    1. <?php
    2.  
    3.  
    4. namespace app\models\user;
    5.  
    6.  
    7. use app\models\admin\Unit;
    8. use core\base\Model;
    9.  
    10. class UserUnit extends Model
    11. {
    12.     // родные
    13.     public $id_user;
    14.     public $id_unit;
    15.     public $amount;
    16.  
    17.     // базовые
    18.     private $user_lvl;
    19.     private $name;
    20.     private $type;
    21.     private $kind;
    22.     private $attack;
    23.     private $defense;
    24.     private $maintenance;
    25.     private $price;
    26.  
    27.     public function getUserLvl()
    28.     {
    29.         return Unit::getFromOne($this->id_unit)->user_lvl;
    30.     }
    31.  
    32.     public function getName()
    33.     {
    34.         return Unit::getFromOne($this->id_unit)->name;
    35.     }
    36.  
    37.     public function getType()
    38.     {
    39.         return Unit::getFromOne($this->id_unit)->type;
    40.     }
    41.  
    42.     public function getKind()
    43.     {
    44.         return Unit::getFromOne($this->id_unit)->kind;
    45.     }
    46.  
    47.     public function getAttack()
    48.     {
    49.         return Unit::getFromOne($this->id_unit)->attack;
    50.     }
    51.  
    52.     public function getDefense()
    53.     {
    54.         return Unit::getFromOne($this->id_unit)->defense;
    55.     }
    56.  
    57.     public function getMaintenance()
    58.     {
    59.         return Unit::getFromOne($this->id_unit)->maintenance;
    60.     }
    61.  
    62.     public function getPrice()
    63.     {
    64.         return Unit::getFromOne($this->id_unit)->price;
    65.     }
    66. }

    Вопрос такой: Какой метод: getFromOne() или getFromAll() мне следует оставить, ЕСЛИ мне, например, нужно будет всё, что принадлежит пользователю, крутануть в цикле с использованием геттеров?

    Хранить в "admin.unit" СРАЗУ весь массив объектов, выбирая по айдишнику нужный объект или выбирать строго по айдишнику только один, НО перезаписывая на каждой итерации "admin.unit"?

    И вообще будет ли работать без косяков выборка по одному с перезаписью в ЦИКЛЕ?

    Прокомментируйте, пожалуйста :)

    p.s. в findAll будет массив из 118-ти объектов
     
    #1 Вероломство, 7 апр 2021
    Последнее редактирование: 7 апр 2021
  2. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    358
    Симпатии:
    12
    использовать getFromAll(), getFromOne() в данном случае не перезапишет ничего

    решено
     
  3. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    420
    Симпатии:
    71
    Игрушку пилишь? :) Есть где посмотреть результат?
     
    Вероломство нравится это.
  4. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    358
    Симпатии:
    12
    всё на локалке :(

    если помнишь, то раньше была игра Генералы (generals.mobi), вот такую пилю.

    я её уже делал на процедурке ЕМНИП лет 7 назад, но там жесть ГК, называется Войнушка, в пабле есть, хочу в ООП перепилить
     
  5. don.bidon

    don.bidon Новичок

    С нами с:
    28 мар 2021
    Сообщения:
    64
    Симпатии:
    4
    https://ngrok.com/ в помощь. Еа бесплатном тарифе там при каждом поднятии сервиса рандомный урл наружний будет, потому надо согласовывать время поднятия сервиса с посетителями и сообщать им урл.

    А так хоть телеграм-бота локально поднимать можно, вот моё поделие https://github.com/donbidon/tunneled-webhooks (если ngrok обновляли, хз, работает ли, со времён последних коммитов не тестировал).