Переименование колонок с совпадающими именами в JSON объекте, лежащем в БД. Возможно ли это?
Допустим, в БД лежит множество записей со следующей структурой:
Пришло задание переименовать ключ
Конечно, это можно сделать на стороне приложения, но обработка, скажем, пары миллионов записей может занять продолжительное время. По нашим тестам, обработка 2.2 млн записей заняла около 56 минут.
Вы удивитесь, но это можно сделать всего за 2.5 минуты. Как? Легко, если в качестве СУБД используется PostgreSQL и колонка имеет тип
Если в объекте есть ключ
Вот и всё.
* Время выполнения указано для запуска под Windows, где БД находится в Docker-контейнере.
Допустим, в БД лежит множество записей со следующей структурой:
{"foo": {"title": "Foo"}, "bar": {"title": "Bar"}}
{"foo": {"title": "Foo"}}
{"bar": {"title": "Bar"}}
{"foo": {"title": "Foo"}, "bar": {"title": "Bar"}, "baz": {"title": "Baz"}}
Пришло задание переименовать ключ
foo
в bar
, а bar
в foo
. Да, просто поменять их местами.Конечно, это можно сделать на стороне приложения, но обработка, скажем, пары миллионов записей может занять продолжительное время. По нашим тестам, обработка 2.2 млн записей заняла около 56 минут.
Вы удивитесь, но это можно сделать всего за 2.5 минуты. Как? Легко, если в качестве СУБД используется PostgreSQL и колонка имеет тип
jsonb
, то всего один запрос решит эту проблему:UPDATE pages
SET metadata = metadata - 'foo' - 'bar'
|| jsonb_build_object('bar', metadata->'foo')
|| jsonb_build_object('foo', metadata->'bar')
WHERE metadata ? 'foo' OR metadata ? 'bar';
-- [2025-02-03 13:14:17] 2,198,814 rows affected in 2 m 23 s 241 ms
Если в объекте есть ключ
foo
и/или bar
, то он будет заменён и на выходе получим результат:{"bar": {"title": "Foo"}, "foo": {"title": "Bar"}}
{"bar": {"title": "Foo"}}
{"foo": {"title": "Bar"}}
{"bar": {"title": "Foo"}, "foo": {"title": "Bar"}, "baz": {"title": "Baz"}}
return new class extends Migration {
public function up(): void
{
DB::raw(
<<<SQL
UPDATE pages
SET metadata = metadata - 'foo' - 'bar'
|| jsonb_build_object('bar', metadata->'foo')
|| jsonb_build_object('foo', metadata->'bar')
WHERE metadata ? 'foo' OR metadata ? 'bar';
SQL
);
}
};
Вот и всё.
* Время выполнения указано для запуска под Windows, где БД находится в Docker-контейнере.
🔥4👍1
Какой самый дурацкий вопрос от коллег по цеху вы слышали в отношении программирования?
👍1
Пост и комменты… Кто-нибудь понял чему так радуются? Или всё можно приписать культу Laravel?
🤣5🤨2
Forwarded from Kvede Новости
Панель администратора для управления ботом @KvedeBot: упростите себе жизнь!
Представляем вам первую версию панели администратора — новый инструмент, который поможет вам эффективно управлять чатами и бороться со спамом.
Что вы получите с панелью администратора?
* Просмотр списка чатов: легко отслеживайте все чаты, в которых вы являетесь администратором.
* Управление модулями: активируйте или деактивируйте модули для чатов одним кликом. Изменения вступают не сразу — используется кэш.
* Локализация сообщений: измените локализацию сообщений бота в чате по своему вкусу.
* Изменение категории чата: изменяя категорию меняются правила проверки сообщений нейронной сетью.
* Уведомления от бота: включите вывод уведомлений от бота на действия пользователя или скройте их. Не распространяется на важные уведомления.
* Ограничение для спамеров: установите срок ограничения для спамера и выберите, банить его или мютить.
* Список модулей и категорий: быстро найдите нужные модули и категории для вашего бота.
На главной странице kvede.com появилась кнопка для быстрого перехода в панель администратора. Не упустите возможность оптимизировать управление вашим ботом!
Перейдите в панель администратора lk.kvede.com прямо сейчас и убедитесь в её удобстве!
Представляем вам первую версию панели администратора — новый инструмент, который поможет вам эффективно управлять чатами и бороться со спамом.
Что вы получите с панелью администратора?
* Просмотр списка чатов: легко отслеживайте все чаты, в которых вы являетесь администратором.
* Управление модулями: активируйте или деактивируйте модули для чатов одним кликом. Изменения вступают не сразу — используется кэш.
* Локализация сообщений: измените локализацию сообщений бота в чате по своему вкусу.
* Изменение категории чата: изменяя категорию меняются правила проверки сообщений нейронной сетью.
* Уведомления от бота: включите вывод уведомлений от бота на действия пользователя или скройте их. Не распространяется на важные уведомления.
* Ограничение для спамеров: установите срок ограничения для спамера и выберите, банить его или мютить.
* Список модулей и категорий: быстро найдите нужные модули и категории для вашего бота.
На главной странице kvede.com появилась кнопка для быстрого перехода в панель администратора. Не упустите возможность оптимизировать управление вашим ботом!
Перейдите в панель администратора lk.kvede.com прямо сейчас и убедитесь в её удобстве!
1🔥2👍1👏1
Выпустили новый проект с переводами для панели администрирования MoonShine 3 на 126 локализаций 🥳
Если Вы пользуетесь
Для установки только расширения MoonShine, воспользуйтесь командами:
Для установки всех возможных переводов продуктов Laravel, воспользуйтесь командами:
https://laravel-lang.com/packages-moonshine.html
Если Вы пользуетесь
laravel-lang/common
, то просто обновите зависимости:composer update
Для установки только расширения MoonShine, воспользуйтесь командами:
composer require laravel-lang/moonshine
php artisan lang:update
Для установки всех возможных переводов продуктов Laravel, воспользуйтесь командами:
composer require laravel-lang/common
php artisan lang:update
https://laravel-lang.com/packages-moonshine.html
🔥9
Хотите сделать мир лучше и поддержать разработчиков?
Присоединяйтесь к нам на Boosty!
Мы стремимся создавать качественные продукты, которые делают жизнь разработчиков проще и удобнее. Но для этого нам нужна ваша поддержка.
Подпишитесь на Boosty и получите доступ к эксклюзивным материалам, а также сможете помочь нам в реализации наших идей. Вместе мы сможем сделать больше и ускорить процесс разработки качественных продуктов.
Не упустите возможность стать частью нашей команды и внести свой вклад в создание лучшего будущего!
Присоединяйтесь к нам на Boosty!
Мы стремимся создавать качественные продукты, которые делают жизнь разработчиков проще и удобнее. Но для этого нам нужна ваша поддержка.
Подпишитесь на Boosty и получите доступ к эксклюзивным материалам, а также сможете помочь нам в реализации наших идей. Вместе мы сможем сделать больше и ускорить процесс разработки качественных продуктов.
Не упустите возможность стать частью нашей команды и внести свой вклад в создание лучшего будущего!
Поймал себя на мысли, что работаю с Laravel ровно 10 лет 😊
Познакомился я с ним примерно 18-го февраля 2015-го года, через две недели после релиза версии 5.0, когда проблем с ним было много, а решений очень мало ибо его архитектура и подход к использованию, по словам очевидцев, были в корне другими по сравнению с версией 4.2.
За это время некогда местечковый фреймворк превратился в целую корпорацию со своей экосистемой и продолжает радовать с каждым релизом. И это замечательно! 😊
Познакомился я с ним примерно 18-го февраля 2015-го года, через две недели после релиза версии 5.0, когда проблем с ним было много, а решений очень мало ибо его архитектура и подход к использованию, по словам очевидцев, были в корне другими по сравнению с версией 4.2.
За это время некогда местечковый фреймворк превратился в целую корпорацию со своей экосистемой и продолжает радовать с каждым релизом. И это замечательно! 😊
👏6👍4❤2🔥2
Для установки красивых иконок в продукты JetBrains, просто положите файл с названием
Иконки Laravel можно взять из официального репозитория.
icon.svg
в папку .idea
любого проекта и перезапустите Toolbox/IDE.Иконки Laravel можно взять из официального репозитория.
👍3
Card Number 1.7.0 released
Added
- Added archtechx/enums v1 support
- Added support for Laravel 12
Changed
- Bump pestphp/pest to 3.0
- The year in the LICENSE file has been updated by @github-actions[bot] in #19
https://github.com/TheDragonCode/card-number/releases/tag/1.7.0
#card_number #card #number
Added
- Added archtechx/enums v1 support
- Added support for Laravel 12
Changed
- Bump pestphp/pest to 3.0
- The year in the LICENSE file has been updated by @github-actions[bot] in #19
https://github.com/TheDragonCode/card-number/releases/tag/1.7.0
#card_number #card #number
GitHub
Release 1.7.0 · TheDragonCode/card-number
Added
Added archtechx/enums v1 support by @andrey-helldar in #20
Added support for Laravel 12 by @andrey-helldar in #22
Changed
Bump pestphp/pest to 3.0 by @andrey-helldar in #21
The year in the...
Added archtechx/enums v1 support by @andrey-helldar in #20
Added support for Laravel 12 by @andrey-helldar in #22
Changed
Bump pestphp/pest to 3.0 by @andrey-helldar in #21
The year in the...
Forwarded from Новости от CutCode
🔥 Стрим по Laravel 12. Обсуждаем очередную революцию! 😆
Друзья, мы дождались! Laravel 12 выходит 24 февраля, и настоящий геймченж! 🎉
Что нового?
- Чуть-чуть обновили зависимости.
- Чуть-чуть подтянули совместимость с PHP.
Дополнительно. Новые Starter Kits с поддержкой React, Vue и Livewire. Теперь можно сразу получить проект с компонентами Shadcn, а для Livewire – бесплатная версия Flux. Это, конечно, круто, но не совсем про сам Laravel. 🤔
🤨 Пройдёмся по обновлению на стриме
- Кирилл Несмеянов будет искать недостатки в идеальном Laravel! 🕵️♂️
- Андрей Хеллдар и Адель Файзрахманов и я будем его защищать! ⚔️
- Возможно, заглянет сам Taylor Otwell! 👀
📅 Когда? 25 февраля в 19:00
📍 Где? На CutCode - https://youtube.com/live/h_DY4gUjncw
Жду вас! А пока можете задавать вопросы! 😅
#Laravel12 #CutCode
Друзья, мы дождались! Laravel 12 выходит 24 февраля, и настоящий геймченж! 🎉
Что нового?
- Чуть-чуть обновили зависимости.
- Чуть-чуть подтянули совместимость с PHP.
Дополнительно. Новые Starter Kits с поддержкой React, Vue и Livewire. Теперь можно сразу получить проект с компонентами Shadcn, а для Livewire – бесплатная версия Flux. Это, конечно, круто, но не совсем про сам Laravel. 🤔
🤨 Пройдёмся по обновлению на стриме
- Кирилл Несмеянов будет искать недостатки в идеальном Laravel! 🕵️♂️
- Андрей Хеллдар и Адель Файзрахманов и я будем его защищать! ⚔️
- Возможно, заглянет сам Taylor Otwell! 👀
📅 Когда? 25 февраля в 19:00
📍 Где? На CutCode - https://youtube.com/live/h_DY4gUjncw
Жду вас! А пока можете задавать вопросы! 😅
#Laravel12 #CutCode
Youtube
- YouTube
Enjoy the videos and music you love, upload original content, and share it all with friends, family, and the world on YouTube.
👍6
RoadRunner vs OpenSwoole vs FrankenPHP с Laravel Octane
На эту тему было опубликовано множество статей из различного рода источников и у многих заметил тенденцию когда каждая из трёх упомянутых технологий значительно лидирует по сравнению с остальными. Тем более что у многих показаны какие-то дикие результаты в виде 1к запросов в секунду...
И мне захотелось всё проверить своими руками...
https://habr.com/ru/articles/885266/
На эту тему было опубликовано множество статей из различного рода источников и у многих заметил тенденцию когда каждая из трёх упомянутых технологий значительно лидирует по сравнению с остальными. Тем более что у многих показаны какие-то дикие результаты в виде 1к запросов в секунду...
И мне захотелось всё проверить своими руками...
https://habr.com/ru/articles/885266/
Хабр
RoadRunner vs OpenSwoole vs FrankenPHP с Laravel Octane
На эту тему было опубликовано множество статей из различного рода источников и у многих заметил тенденцию когда каждый из трёх упомянутых технологий значительно лидирует по сравнению с остальными. Тем...
1👍10🔥1
Красивые иконки для IDE? Легко!
Шаг 1: Устанавливаем библиотеку в глобальную область видимости Composer:
Шаг 2: Публикуем иконку
Также возможно разом опубликовать иконки во всех проектах папки (рекурсивный поиск):
И также можно задать конкретный путь:
https://github.com/TheDragonCode/iconify-ide
Шаг 1: Устанавливаем библиотеку в глобальную область видимости Composer:
composer global require dragon-code/iconify-ide:*
Шаг 2: Публикуем иконку
cd /to/your/project
iconify
Также возможно разом опубликовать иконки во всех проектах папки (рекурсивный поиск):
iconify --all
И также можно задать конкретный путь:
iconify --path=/../foo/bar/
iconify --path=/../foo/bar/ --all
https://github.com/TheDragonCode/iconify-ide
❤4👍4🔥2
🚀 Ускорить взаимодействие Laravel приложения с Redis? Легко!
Итак, что для этого нужно:
Создаём папку
Далее открываем файл
И перезапускаем службу:
Далее в файл конфигурации
Значение
После этих манипуляций меняем настройки окружения приложения на сервере:
Не забудьте перекэшировать конфиги (
И всё, теперь взаимодействие веб-приложения с Redis будет осуществляться не через TCP, а по сокетам, что даёт прирост скорости взаимодействия примерно в 50%.
https://www.laravel-enlightn.com/docs/performance/redis-single-server-analyzer.html
Нюанс
Способ работает лишь в том случае, когда и приложение, и Redis находятся на одном сервере.
Итак, что для этого нужно:
Создаём папку
/var/run/redis
, если она не создана, а также меняем её права, а также добавляем пользователя, под которым запускается cli и web, в группу "redis":sudo mkdir -p /var/run/redis/
sudo chown -R redis:redis /var/run/redis
sudo chmod 770 /var/run/redis
sudo usermod -aG redis www-data
Далее открываем файл
/etc/redis/redis.conf
, находим строку с объявлением unixsocket
и раскомментируем их:unixsocket /var/run/redis/redis-server.sock
unixsocketperm 770
И перезапускаем службу:
systemctl restart redis
Далее в файл конфигурации
config/database.php
добавляем новый параметр в опции Redis:'redis' => [
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
'scheme' => env('REDIS_SCHEME', 'tcp'), // этот ключ
],
// ...
],
Значение
tcp
позволит работать с Redis "как обычно".После этих манипуляций меняем настройки окружения приложения на сервере:
-REDIS_HOST=redis
-REDIS_PASSWORD=null
-REDIS_PORT=6379
+REDIS_HOST=/var/run/redis/redis-server.sock
+REDIS_PORT=null
+REDIS_SCHEME=unix
Не забудьте перекэшировать конфиги (
php artisan optimize
) и перезапустить php-fpm или Laravel Octane, в зависимости от того чем пользуетесь. А также очереди в супервизоре - их также нужно перезапустить.И всё, теперь взаимодействие веб-приложения с Redis будет осуществляться не через TCP, а по сокетам, что даёт прирост скорости взаимодействия примерно в 50%.
https://www.laravel-enlightn.com/docs/performance/redis-single-server-analyzer.html
🔥8👍1
⚡️ Выполнение любых действий в процессе развертывания? Легко!
Создавайте специальные классы для одноразового или многоразового использования, которые могут выполняться автоматически после каждого развертывания. Идеально подходит для создания и обновления данных, подготовки изображений или других файлов, связи с внешними сервисами, выполнения служебных команд и любых других.
Этот пакет предназначен для вас, если...
- требуется регулярное обновление данных после деплоя;
- часто выполняете какие-либо действия после развертывания;
- иногда забываете выполнить одно конкретное задание, и всё идет наперекосяк;
- код захламлён заданиями, которые больше не используются;
- коллегам постоянно нужно напоминать о необходимости выполнить это одно задание после некоторых изменений в базе данных
вы часто засеваете или обрабатываете данные в файле миграции (что является большим недопущением!)
Просто установите Laravel Deploy Operations и забудьте о боли!
В качестве плюшек доступны опции, среди которых:
- Одноразовое или многоразовое выполнение;
- Запуск команд в два этапа - «до» и «после» какого-то действия;
- Активация транзакций;
- Проверка среды запуска (only или exclude)
- Лёгкое создание файла при помощи плагина Laravel Idea.
Подробнее читайте в документации: https://deploy-operations.dragon-code.pro/getting-started/installation.html
Создавайте специальные классы для одноразового или многоразового использования, которые могут выполняться автоматически после каждого развертывания. Идеально подходит для создания и обновления данных, подготовки изображений или других файлов, связи с внешними сервисами, выполнения служебных команд и любых других.
Этот пакет предназначен для вас, если...
- требуется регулярное обновление данных после деплоя;
- часто выполняете какие-либо действия после развертывания;
- иногда забываете выполнить одно конкретное задание, и всё идет наперекосяк;
- код захламлён заданиями, которые больше не используются;
- коллегам постоянно нужно напоминать о необходимости выполнить это одно задание после некоторых изменений в базе данных
вы часто засеваете или обрабатываете данные в файле миграции (что является большим недопущением!)
Просто установите Laravel Deploy Operations и забудьте о боли!
В качестве плюшек доступны опции, среди которых:
- Одноразовое или многоразовое выполнение;
- Запуск команд в два этапа - «до» и «после» какого-то действия;
- Активация транзакций;
- Проверка среды запуска (only или exclude)
- Лёгкое создание файла при помощи плагина Laravel Idea.
Подробнее читайте в документации: https://deploy-operations.dragon-code.pro/getting-started/installation.html
❤2
🏗 Экспорт данных из таблиц при "схлапывании" миграций? Легко!
Устали экспортировать данные руками или поддерживать выполняющие это действие скрипты? Или не "схлапываете" миграции именно потому что нет простого решения для экспорта данных из определённых таблиц, а в папке скопилось под тысячу файлов миграций, а то и больше?
Решение есть! Встречайте DDD - Database Data Dumper.
Теперь при выполнении консольной команды
Просто установите зависимость:
И добавьте в конфигурационный файл
Укажите наименование таблиц и/или ссылки на модели и всё, данные будут экспортированы!
В качестве бонуса, можно также удалять файлы при экспорте. В этом случае имя ключа будет равно имени таблицы или класса, а в значении массив из двух элементов, где первый указывает на имя колонки, содержащей название файла, а вторым элементом путь к папке с этими файлами.
Нюанс лишь один - при "схлапывании" миграций с передачей параметра
https://github.com/TheDragonCode/laravel-data-dumper
Устали экспортировать данные руками или поддерживать выполняющие это действие скрипты? Или не "схлапываете" миграции именно потому что нет простого решения для экспорта данных из определённых таблиц, а в папке скопилось под тысячу файлов миграций, а то и больше?
Решение есть! Встречайте DDD - Database Data Dumper.
Теперь при выполнении консольной команды
php artisan schema:dump
в файл экспорта также будет экспортировано и содержание выбранных Вами таблиц.Просто установите зависимость:
composer require dragon-code/laravel-data-dumper
И добавьте в конфигурационный файл
config/database.php
новый ключ:return [
// ...
'schema' => [
'tables' => [
// здесь нужно перечислить наименования
],
],
];
Укажите наименование таблиц и/или ссылки на модели и всё, данные будут экспортированы!
В качестве бонуса, можно также удалять файлы при экспорте. В этом случае имя ключа будет равно имени таблицы или класса, а в значении массив из двух элементов, где первый указывает на имя колонки, содержащей название файла, а вторым элементом путь к папке с этими файлами.
Нюанс лишь один - при "схлапывании" миграций с передачей параметра
--prune
, то есть с удалением "схлопнутых" файлов, в Laravel 11.35.2 и ниже, файлы удаляться не будут так как те версии Laravel не содержали эвент отвечающий за факт вызова удаления файлов, а вот начиная с 11.36 эвент есть.https://github.com/TheDragonCode/laravel-data-dumper
🔥3🤩1
Laravel-Lang теперь поддерживает Laravel Starter Kits 😀
Просто установите библиотеку и обновите локализации! Да, так просто!
Также можно просто установить
https://laravel-lang.com/packages-starter-kits.html
Просто установите библиотеку и обновите локализации! Да, так просто!
Также можно просто установить
laravel-lang/common
. Переводы для Starter Kits теперь устанавливаются вместе с ним 🥳https://laravel-lang.com/packages-starter-kits.html
❤4
📦 Огромный JS файл при компиляции приложения с использованием сборщика Vite? Вызов принят!
Всё что нужно для решения проблемы - это указать что следует "чанковать".
Например, в приложении установлены следующие зависимости:
Вынесем условно системные в один файл и вспомогательные во второй. Для этого в файле
И на выходе получаем разделённые файлы.
Нюанса два:
1. Если сам плагин много весит, то его не разбить - можно лишь сами плагины "раскидать по файлам";
2. RollOut разбивает только скриптовые файлы (js, ts) - стили не трогает, поэтому нужно отдельно указывать параметр
Подробнее можно прочитать здесь:
- https://v3.vitejs.dev/guide/build.html#chunking-strategy
- https://rollupjs.org/configuration-options/#output-manualchunks
Всё что нужно для решения проблемы - это указать что следует "чанковать".
Например, в приложении установлены следующие зависимости:
"devDependencies": {
"@tailwindcss/postcss": "^4.0.6",
"@tailwindcss/vite": "^4.0.6",
"apexcharts": "^4.5.0",
"axios": "^1.7.4",
"concurrently": "^9.0.1",
"laravel-vite-plugin": "^1.0",
"postcss": "^8.5.2",
"sass-embedded": "^1.83.4",
"tailwindcss": "^4.0.6",
"vite": "^6.0",
"vite-plugin-static-copy": "^2.2.0"
}
Вынесем условно системные в один файл и вспомогательные во второй. Для этого в файле
vite.config.js
нужно добавить конфигурацию, например:export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks: {
request: ['axios'],
styles: ['tailwindcss'],
charts: ['apexcharts']
}
}
},
cssCodeSplit: true
},
})
И на выходе получаем разделённые файлы.
Нюанса два:
1. Если сам плагин много весит, то его не разбить - можно лишь сами плагины "раскидать по файлам";
2. RollOut разбивает только скриптовые файлы (js, ts) - стили не трогает, поэтому нужно отдельно указывать параметр
cssCodeSplit
для Vite.В документации по Vite пишут использовать плагин `splitVendorChunkPlugin`, но в Vite 6.2 он отмечен как `deprecated` и взамен рекомендуется использовать "прямые" опции для `rollup`, конструкция которых приведена в этом посте.
Подробнее можно прочитать здесь:
- https://v3.vitejs.dev/guide/build.html#chunking-strategy
- https://rollupjs.org/configuration-options/#output-manualchunks
👍6🔥4👏1🤝1
Убедиться в том, что все запросы, отправленные через Http клиент, были замоканы во время выполнения тестов, можно используя метод
После его объявления все запросы, не имеющие перехвата через
https://laravel.com/docs/12.x/http-client#preventing-stray-requests
Http::preventStrayRequests()
.После его объявления все запросы, не имеющие перехвата через
Http::fake()
, будут выбрасывать ошибку вместо отправки реального запроса.https://laravel.com/docs/12.x/http-client#preventing-stray-requests
👍6🔥3❤1