Задать вопрос
  • Laravel 5: как лучше выводить данные из бд?

    Fernus
    @Fernus
    Техник - Механик :)
    class Order extends Model
    {
    
        // ... Тут стандартное начало модели
        
        protected $appends = [
            'status_color'
        ];
    
        
        public function getStatusColorAttribute() {
    
            switch($this->status) {
            
                case 1:
                
                    return 'зелёный';
                
                break;
                
                
                case 2:
                
                    return 'синий';
                
                break;
                
                case 3:
                
                    return 'красный';
                
                break;
                
                default:
                
                    return 'хз';
                
                break;
            
            
            }
        }
    
    }
    Ответ написан
    3 комментария
  • Как вывести данные из MySQl с помощью REDBEANPHP не указывая в запросе имен полей?

    Fernus
    @Fernus
    Техник - Механик :)
    https://prowebmastering.ru/redbeanphp-orm-dlya-php...

    Как-то так походу...первый раз вижу эту библиотеку...

    $res = R::getAll('SELECT * FROM `table`');
    
    // <table>
            
            $i = 0;
            foreach($res as $item) {
    
                if($i <= 0) {
    
                    // <tr>
                    
                    foreach ($item as $key => $val) {
    
                        
                        // Тут печатаем заголовки таблицы - переменная $key
                        // <td>$key</td>
    
                    }
                    
                    // </tr>
                }
    
                // <tr>
    
                foreach ($item as $key => $val) {
    
    
    
                    // Тут печатаем остальные данные таблицы - переменная $val
                    // <td>$val</td>
    
                }
    
                // </tr>
    
                $i++;
    
            }
            
            // </table>


    UPDATE...
    Ответ написан
  • Если в БД есть запись "строка" - вставить запись "строка-1", если есть "строка-1" - вставить "строка-2"?

    Fernus
    @Fernus
    Техник - Механик :)
    Я бы немного изменил структуру, добавив одно дополнительное поле и уникальный индекс на поле name...
    Короче...

    Таблица:
    CREATE TABLE `test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      `count` int(11) NOT NULL DEFAULT 0,
      PRIMARY KEY (`id`),
      UNIQUE KEY `name` (`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


    При вставке записей использовал бы такой запрос:
    INSERT INTO `test` (`name`) VALUES ('строка') 
    ON DUPLICATE KEY 
    UPDATE `count` = `count` + 1;


    Что в итоге?

    - В итоге не будет лишних объёмов данных в БД...
    - Всего один запрос на вставку;
    - В поле count будет число - сколько раз была занесена данная строка в БД...

    UPDATE:

    Исходя из комментариев и подробностей автора дополняю ответ...

    Можно например использовать Redis (increment)...
    Где ключ будет "строка" (в данном случае kot например).
    Перед записью ныряем в Redis, подкручиваем "счётчик" и далее берем это значение и записываем в MySQL в поле slug:

    kot-ЗНАЧНИЕ_СЧЁТЧИКА

    В итоге один запрос в Redis и один INSERT в MySQL...

    Понятна мысля?)

    P.S.: Redis можно и на MySQL тож заменить...используя мой первый вариант в ответе в качестве счётчика вместо Redis'а...но тут на пару запросов больше выйдет...что и не критично в данном случае думаю...
    Ответ написан
    4 комментария
  • Postgresql или mariadb для больших таблиц?

    Fernus
    @Fernus
    Техник - Механик :)
    Вот тут по полкам всё...
    https://developer.okta.com/blog/2019/07/19/mysql-v...

    MySQL я бы выбрал скорее всего...раз записей/обновлений мало и по крону...

    Из статьи:
    Postgres создан с учетом расширяемости, соответствия стандартам, масштабируемости и целостности данных - иногда в ущерб скорости. Поэтому для простых рабочих процессов с большим количеством операций чтения Postgres может оказаться худшим выбором, чем MySQL.
    Ответ написан
    Комментировать
  • Почему не работает поиск по сайту phprusearch?

    Fernus
    @Fernus
    Техник - Механик :)
    <form action="phprusearch/" method="post" class="search">
    <input type="text" name="query" placeholder="Поиск..."><input type="submit" value="Найти" class="btn btn-info">
    </form>


    Вангую, что ошибка в ссылке в action в теге form...
    Добавьте слэш в начало action:
    /phprusearch/
    Ответ написан
    2 комментария
  • Как наиболее рационально обновлять данные в моделях Laravel?

    Fernus
    @Fernus
    Техник - Механик :)
    1. Сделать функцию, которая будет на вход получать значение цены и тип валюты...а далее умножать на курс этой валюты при выводе...
    2. Сам курс можно обновлять раз в какое-то время (хоть раз в 10 минут) - не дорогостоящая операция;
    3. В том месте, где будет использоваться цена, использовать функцию из пункта 1.

    Операция умножения при выводе много ресурсов не потратит...
    Ответ написан
    Комментировать
  • Как отсортировать данные и получить 10 элементов ДО и 10 элементов ПОСЛЕ в Laravel?

    Fernus
    @Fernus
    Техник - Механик :)
    Попробуй так...кроме условия score...как ты в коммах пишешь, можно и дату добавить в orderBy...для случаев с одинаковыми...
    <?php
    
    $rsUser = Model::where('user_id', ID_ЮЗЕРА)->first();
    
    if($rsUser) {
    
        DB::statement(DB::raw('set @row := 0'));
    
        $rsFirst2Before = Model::where('score', '<=', $rsUser->score)->orderBy('score', 'DESC')->select(['*', DB::raw('@row := @row + 1 as `row`')])->limit(11);
        $rsAfter = Model::where('score', '>=', $rsUser->score)->where('user_id', '<>', $rsUser->user_id)->orderBy('score', 'ASC')->select(['*', DB::raw('@row : = @row + 1 as `row`')])->limit(10);
        
        $rs = $rsFirst2Before->union($rsAfter)->get();
    
        // dump($rs);
        
    }
    
    ?>


    P.S.: В моём ответе подразумевается ещё и порядковый номер в рейтинге среди всех...
    Если вообще это работать будет :) Я не тестил, но должно))
    Проверяй))

    Порядковый номер по ключу row будет доступен...

    UPD:
    Ещё немного подправил ответ...там добавил where('user_id', '<>', $rsUser->user_id), чтобы не было "в последующих 10" одного и того же юзера, если есть с одинаковым рейтингом...

    UPD2:
    Хотя и тут есть нюанс...если будет, например, 30 юзеров с одинаковым рейтингом...
    Короче, если это сработает, дальше разберёмся, чтобы до идеала довести :)

    UPD3:
    Ещё рассмотрите вариант с временной таблицей...в которую раз в какое-то время (или по событию) сразу записывать юзеров и их места...
    По мне так - это самый лучший вариант...
    Ответ написан
  • Сортировка идентификаторов в массиве php?

    Fernus
    @Fernus
    Техник - Механик :)
    <?php
    
    $from_id = $items->pluck('from_id');
    $arFormIds = $from_id->toArray();
    
    $arPlus = $from_id->where($arFormIds, function ($value, $key) {
        return $value > 0;
    })->toArray();
    
    $arMinus = $from_id->where($arFormIds, function ($value, $key) {
        return $value < 0;
    })->toArray();
    
    // $arPlus - все положительные
    // $arMinus - все отрицательные
    
    ?>

    P.S.: Можно немного изящнее:

    <?php
    
    // $items - твоя коллекция...без pluck...
    
    $arPlus = $items->where('form_id', '>', 0)->toArray();
    $arMinus = $items->where('form_id', '<', 0)->toArray();
    
    // $arPlus - все положительные
    // $arMinus - все отрицательные
    
    ?>
    Ответ написан
  • Как сделать одинаковый header и footer для всех шаблонов сайта?

    Fernus
    @Fernus
    Техник - Механик :)
    Комментировать
  • Запросить один запрос или много?

    Fernus
    @Fernus
    Техник - Механик :)
    Делать на каждый день новый запрос и заносить в график

    Что это значит в Вашем случае?
    У Вас на странице только за какой-то период отображение по дням идёт? Или как?

    В любом случае из БД получать нужно только то, что Вам щас потребуется для отображения...
    Если использовать "коллекции" запихнув туда все данные из БД, то когда транзакций будет "куча"...то с каждым увеличением этой "кучи" Ваши коллекции будут всё медленнее, а CPU и RAM всё больше страдать + время выполнения увеличиваться...

    UPD:
    ...
    Ответ написан
    9 комментариев
  • Этапы разработки проекта и нужные для этого люди и технологии?

    Fernus
    @Fernus
    Техник - Механик :)
    Минимальный бюджет (не в плане мало платить исполнителям, а в плане минимально участвующих разработчиков):
    1. Опытный программист-бэкендер (в Вашем случае лучше с профилем под Laravel);
    2. Опытный фронтендер;
    3. Дизайнер;
    4. Системный администратор.

    1 и 2 пункты можно разбавить ещё по одному специалисту, чтобы были на "подхвате" у опытных и ими же курировались...зависит от объёма задач...

    Редко, но можно найти 1 и 4 пункт в одном лице (иногда даже лучше...ибо сам бэкендер знает, что ему может потребоваться и соответственно сможет "на лету" под себя подстраивать систему)...
    Ещё реже, можно найти в одном лице 1,2 и 4...но тут просядет скорость разработки...

    Ну и постоянная связь между специалистами из 1 и 2 пункта должна быть...чтобы согласовывать каждый этап разработки...
    Ответ написан
    2 комментария
  • Carbon, как к одной дате выведенной из базы прибавить другую?

    Fernus
    @Fernus
    Техник - Механик :)
    1. Работа с Carbon;
    2. Если создадите модель и укажите для этого поля, что оно - дата (подробнее), то можно будет делать по Вашей схеме, как и хотели...
    Ответ написан
    Комментировать
  • Как получить количество записей + сложить количество из столбца?

    Fernus
    @Fernus
    Техник - Механик :)
    SELECT COUNT(*) AS `ALL`, SUM(IF(`count` IS NULL, 1, `count`)) AS `ALL_SUM` FROM `table`;
    /*
    ALL - общее кол-во записей
    ALL_SUM - сумма столбца `count` с учётом, что NULL считаем за единицу
    */

    5fc7908df06dc066093645.png
    5fc790a08cee3653185908.png

    Ну и на всякий случай, бонусом:
    SELECT *, COUNT(*) AS `ALL`, SUM(IF(`count` IS NULL, 1, `count`)) AS `ALL_SUM` FROM `table` GROUP BY `id`;
    /*
    Это по каждой записи суммарное кол-во в поле `count` с учётом, что NULL считаем за единицу
    */

    НО, если id это первичный уникальный ключ, то тут вообще можно убрать GROUP BY, а так же SUM и оставить только IF...т.е.
    SELECT *, IF(`count` IS NULL, 1, `count`) AS `ALL_SUM` FROM `table`
    Ответ написан
    1 комментарий
  • Правильное вывод отношения?

    Fernus
    @Fernus
    Техник - Механик :)
    $rs = Model::with('parent')->какие-то_условия->whereNotNull('parent_id')->get();
    
    foreach($rs as $item) {
    
        $rsParents = $item->parent; // parent - это связь "к себе самой"
    
        if($rsParents->count() > 0) {
    
            $i = 0;
            foreach($rsParents as $p_item) {
                $i++;
                // $item->id.'-Д-'.$i; // Папы с дочками
    
            }
    
        }else{
    
            // $item->id // Холостяк
    
        }
    
    }


    UPD:
    ...
    Ответ написан
    Комментировать
  • Обновить структуры таблиц mysql?

    Fernus
    @Fernus
    Техник - Механик :)
    Оба варианта имеют место быть...

    Первый вариант предпочтительнее...потому что будет возможность перед "выключением" заглушки самому всё проверить...

    Второй вариант - если "простой" сервиса нежелателен...

    Я бы выбирал всегда первый вариант по возможности...ибо, если на этом сервисе "сидят" полтора человека...то не страшно, если обождут ситуацию... :)

    Ну и при втором варианте надо конечно не прокосячить с написанием скрипта...+ БЕКАП старой версии на всякий случай...да и при первом варианте БЕКАП...
    Ответ написан
    2 комментария
  • Как правильно собрать php запрос на отображение содержимого по id?

    Fernus
    @Fernus
    Техник - Механик :)
    Если БД MySQL, то можно так:
    /* 1 - id категории "Химия" */
    SELECT * FROM `site_news` WHERE FIND_IN_SET('1', `category`);


    MySQL - FIND_IN_SET
    Ответ написан
    Комментировать
  • NGINX + LUA = Benchmark. У кого есть опыт?

    Fernus
    @Fernus Автор вопроса
    Техник - Механик :)
    Удалось увеличить производительность примерно на 5% (слёзы конечно, но может и нереально больше выжать из текущего стека)...

    В nginx.conf добавляем в секцию events:
    accept_mutex off;

    В "хостах":
    aio threads;

    При этом nginx должен быть собран с опцией:
    --with-file-aio

    Подробнее тут:
    https://habr.com/ru/post/260669/

    Но это не во всех случаях будет приемлемо...читаем - гуглим - вникаем...
    Я после каждого изменения конфига прогонял тест несколько раз...

    НО, всё равно, жду людей кто так же экспериментировал - буду благодарен, если ещё чего подскажите...

    UPD:
    По сравнению с предыдущими тестами щас стабильно держит на 100 запросов больше в сумме за 15 сек и на 15-20 за 1 сек...
    Прирост отдачи "трафика" больше на ~1мб...

    UPD2:
    Текстовый файл содержащий "hello" отдаётся со скоростью ~2800 запросов в сек...

    Вообщем, как и написали, дальше дело в сети...для реальных тестов её надо исключать...
    Ответ написан
    Комментировать
  • Как настроить cron для запуска php скрипта?

    Fernus
    @Fernus
    Техник - Механик :)
    Используйте __DIR__ для получения текущего каталога..и относительно него подключайте скрипты при запуске из командной строки...
    Ответ написан
    Комментировать
  • Как устроен современный сайт?

    Fernus
    @Fernus
    Техник - Механик :)
    Лучше гугла тут ничем не помочь...

    Если учитывать это:
    Вот если брать образцовый сайт в 2020, то как он будет устроен?

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

    То "гугли" с фильтром по годам 2018-2020... :)
    Ответ написан
    Комментировать
  • Как получить позицию первого вхождения подстроки?

    Fernus
    @Fernus
    Техник - Механик :)
    <?php
    
    public function findUrl($message) {
        $result = false;
    
        $domains = ['.com', '.ru', '.cc'];
        foreach($domains as $domain) {
            $data = strpos($message, $domain);
            if($data !== false) {
                $result = $data;
                break;
            }
        return $result;
    }
    Ответ написан
    1 комментарий