Proxy - контроль доступу і кеш
Ставить посередника перед реальним об'єктом для кешування, перевірки прав чи лінивої ініціалізації. Різновиди проксі та відмінність від Decorator.
Почніть вводити, щоб шукати по статтях, вакансіях, компаніях, проєктах, ресурсах, пакетах, подіях і користувачах.
Статті, новини, туторіали та переклади від учасників спільноти
Ставить посередника перед реальним об'єктом для кешування, перевірки прав чи лінивої ініціалізації. Різновиди проксі та відмінність від Decorator.
Складні join'и повторюються скрізь?
Створи database view. Запитуй його як таблицю.
Переваги:
Компроміс:
Views тільки для читання. Потрібні міграції схеми для змін.
Порада: Ідеально для запитів звітності та дашбордів.
Laravel AI Tasks - пакет, що надбудовується над Laravel AI SDK, додаючи операційні можливості: багаторазові класи завдань, три режими виконання (синхронний, черговий, потоковий), дашборд з аудитом, підтримку восьми провайдерів та контроль бюджету на рівні орендарів.
phpcpd-next - CLI-інструмент для виявлення скопійованих блоків коду у PHP-проєктах. Підтримує три алгоритми детекції, включно з пошуком переупорядкованих та змінених фрагментів, інтеграцію з GitHub Code Scanning, вбудований API та PHPUnit-трейт для перевірки дублювання у тестах.
Фільтруєш користувачів які мають пости? whereHas() створює підзапит.
whereRelation() використовує join. Швидше на великих таблицях.
Різниця в продуктивності:
whereHas() - підзапит для перевірки кожного рядкаwhereRelation() - одна join операціяКоли використовувати:
Використовуй whereRelation() для простих умов на пов'язаних моделях.
Використовуй whereHas() коли потрібна складна логіка або підрахунок.
Покращення Laravel 11:
whereRelation() додано в Laravel 8.57. Читабельніше ніж ручні join'и.
Порада: Для простих фільтрів зв'язків завжди віддавай перевагу whereRelation() над whereHas().
Завантаження всіх колонок? Витрачається пам'ять та пропускну здатність.
Обирай тільки колонки які реально використовуєш. Менший об'єм даних. Швидші запити. Менше пам'яті.
Прихована ціна:
Текстові колонки можуть бути величезними. JSON колонки ще більші. Timestamps які можливо не потрібні.
Перевага індексу:
Запити з меншою кількістю колонок можуть використовувати covering індекси.
Порада: Профілюй з EXPLAIN щоб побачити чи запит використовує index-only scan.
// ПОГАНО: Завантажує все включаючи великі текстові поля
$posts = Post::where('published', true)->get();
// ДОБРЕ: Тільки потрібні колонки
$posts = Post::select('id', 'title', 'slug', 'published_at')
->where('published', true)
->get();
// Приклад API відповіді
public function index()
{
return Post::select([
'id',
'title',
'slug',
'excerpt',
'published_at',
])
->with('author:id,name,avatar')
->where('published', true)
->paginate(20);
}
// Dropdown/автозаповнення
$users = User::select('id', 'name')
->where('active', true)
->get();
// Зі зв'язками - вказуй колонки для обох
$posts = Post::select('id', 'title', 'author_id')
->with('author:id,name')
->get();
Економить пам'ять, повторно використовуючи спільні екземпляри замість тисяч однакових. Розділення стану на внутрішній і зовнішній на прикладі кешу довідників.
Laravel 13.18.0 додає метрики воркерів до події WorkerStopping, коректне опрацювання сигналів завершення для schedule:work, пріоритетну реєстрацію команд artisan dev та низку виправлень у Number-хелперах, кеші та планувальнику.
Потрібні обчислені колонки без завантаження повних моделей?
selectRaw() робить обчислення на рівні SQL.
База даних обробляє. Повертає тільки результати.
Поширене використання:
Виграш продуктивності:
База даних робить математику. Не PHP. Повертає тільки те що потрібно.
Порада: Завжди використовувати parameter binding щоб запобігти SQL ін'єкції.