Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Tips 22 липня 2026

Eloquent Casts - автоматичне перетворення типів

База зберігає JSON як рядок. Ви всюди вручну робите decode.

Casts виконують перетворення типів автоматично. Ви працюєте з нативними типами PHP.

Поширені касти:

  • array / json - авто-encode/decode
  • boolean - 0/1 → true/false
  • date / datetime - об'єкти Carbon
  • encrypted - автоматичне шифрування/дешифрування

Кастомні касти:

Можна створювати власні для складніших перетворень.

Порада: використовуйте encrypted для чутливих даних (напр. номери карток).

6
class User extends Model
{
  protected $casts = [
    'email_verified_at' => 'datetime',
    'settings' => 'array',
    'is_admin' => 'boolean',
    'metadata' => 'json',
    'birth_date' => 'date',
    'salary' => 'decimal:2',
    'credit_card' => 'encrypted',
  ];
}

// JSON cast - працюємо з масивами
$user->settings = ['theme' => 'dark', 'lang' => 'en'];
$user->save(); // Зберігається як JSON-рядок

$theme = $user->settings['theme']; // Авто-декод

// Datetime cast - Carbon
echo $user->email_verified_at->diffForHumans();

// Boolean cast
if ($user->is_admin) {
  // 1/0 у базі, але в коді - true/false
}

Читати в документації

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Інші поради

Tips 11 вересня 2026

sortBy() з кількома колонками

Потрібно сортувати за кількома полями? Подібно до ORDER BY у SQL.

sortBy() приймає масив пар "колонка/напрям".

Синтаксис:

Масив масивів: [column, direction].

Напрям:

asc або desc.

Порада: використовуйте sortByDesc() для одного поля зі спаданням.

$users = collect([
  ['name' => 'John', 'age' => 30, 'city' => 'NYC'],
  ['name' => 'Jane', 'age' => 25, 'city' => 'LA'],
  ['name' => 'Bob', 'age' => 30, 'city' => 'SF'],
]);

// Сортування за віком, потім за ім'ям
$sorted = $users->sortBy([
  ['age', 'asc'],
  ['name', 'asc'],
]);

// За містом спаданням, далі за віком
$sorted = $users->sortBy([
  ['city', 'desc'],
  ['age', 'asc'],
]);

// З callback
$sorted = $users->sortBy([
  [fn($user) => $user['age'], 'desc'],
  ['name', 'asc'],
]);

// Еloquent-колекції
$posts = Post::all()->sortBy([
  ['featured', 'desc'],
  ['published_at', 'desc'],
]);
Tips 09 вересня 2026

whenEmpty() та whenNotEmpty() - умовні операції

Потрібно виконувати код лише тоді, коли колекція порожня або непорожня? if/else роблять код об'ємним.

whenEmpty() та whenNotEmpty() роблять це чисто.

Приклади використання:

  • Показати контент за замовчуванням
  • Логувати попередження
  • Запускати fallback-логіку
  • Присвоювати значення за замовчуванням

Перевага:

Методи ланцюжаться та зберігають fluent-синтаксис.

Порада: значення, повернуте з callback, стає новим значенням колекції.

3
$users = User::where('active', true)->get();

// ПОГАНО: розривається ланцюжок
if ($users->isEmpty()) {
  return redirect()->back()->with('error', 'No active users');
}

// ДОБРЕ: fluent-синтаксис
$users->whenEmpty(function () {
  return redirect()->back()->with('error', 'No active users');
});

// Додати елементи за замовчуванням, якщо порожньо
$products = Product::where('featured', true)->get();

$products = $products->whenEmpty(function ($collection) {
  return Product::latest()->limit(5)->get();
});

// Логування, якщо непорожня
$errors->whenNotEmpty(function ($collection) {
  Log::error('Validation errors found', $collection->toArray());
});

// З "else"
$users->whenEmpty(
  fn($collection) => ['name' => 'Guest'],
  fn($collection) => $collection->first()
);
Tips 07 вересня 2026

firstWhere() - Пошук елемента за атрибутом

Потрібно знайти перший елемент, що відповідає умові?

firstWhere() виглядає чистіше, ніж filter()->first().

Переваги:

  • Один метод замість двох
  • Автоматична обробка null
  • Підтримує оператори

Оператори:

Такі ж, як у where(): =, !=, >, <, >=, <=

Порада: використовуйте другий параметр для значення за замовчуванням, якщо елемент не знайдено.

3
$users = collect([
  ['id' => 1, 'name' => 'John', 'age' => 25],
  ['id' => 2, 'name' => 'Jane', 'age' => 30],
  ['id' => 3, 'name' => 'Bob', 'age' => 35],
]);

// ПОГАНО: два методи
$user = $users->filter(fn($u) => $u['age'] > 30)->first();

// ДОБРЕ: один метод
$user = $users->firstWhere('age', '>', 30);
// ['id' => 3, 'name' => 'Bob', 'age' => 35]

// Точна відповідність (оператор за замовчуванням - =)
$user = $users->firstWhere('name', 'Jane');

// Із значенням за замовчуванням
$guest = ['name' => 'Guest'];
$user = $users->firstWhere('age', '>', 100) ?? $guest;

// Eloquent-колекції
$featured = Post::all()->firstWhere('featured', true);

// Кілька умов - first із callback
$user = $users->first(
  fn($u) => $u['age'] > 30 && $u['name'] !== 'Bob'
);
Tips 04 вересня 2026

unique() - інтелектуальне видалення дублікатів

Є дублікати email? Перевіряти вручну необов'язково.

unique() видаляє дублікати.

Як працює:

Залишає перше значення, інші прибирає.

Розширення:

  • Унікальність за ключем
  • Унікальність за callback
  • Строге порівняння

Порада: uniqueStrict() враховує тип (1 !== "1").

5
$numbers = collect([1, 2, 2, 3, 3, 4]);
$unique = $numbers->unique();
// [1, 2, 3, 4]

// За ключем
$users = collect([
  ['id' => 1, 'email' => 'john@example.com'],
  ['id' => 2, 'email' => 'jane@example.com'],
  ['id' => 3, 'email' => 'john@example.com'],
]);

$uniqueByEmail = $users->unique('email');

// За callback
$products = collect([
  ['name' => 'iPhone', 'price' => 999],
  ['name' => 'Samsung', 'price' => 999],
  ['name' => 'iPad', 'price' => 799],
]);

$uniqueByPrice = $products->unique(fn($i) => $i['price']);

// Строге порівняння
collect([1, '1', 2, '2'])->unique();       // [1, 2]
collect([1, '1', 2, '2'])->uniqueStrict(); // [1, '1', 2, '2']

// Скинути ключі
$unique->values();
Tips 02 вересня 2026

lazy() - колекції без перевантаження пам'яті

Якщо обробляється 50 000 елементів і застосовується 10 методів, звичайна колекція створить 10 копій у пам'яті.

Lazy колекції обробляють один елемент за раз.

Як працює:

Елемент проходить через усі методи і лише потім переходить до наступного.

Коли варто використовувати:

  • Великі файли
  • Стрімінг
  • Генератори
  • Обмежена пам'ять

Порада: перетворити назад у звичайну колекцію - all().

// Погано: багато копій у пам'яті
$result = collect($hugeArray)
  ->filter(...)
  ->map(...)
  ->sortBy(...)
  ->take(100);

// Добре: один елемент за раз
$result = collect($hugeArray)
  ->lazy()
  ->filter(...)
  ->map(...)
  ->sortBy(...)
  ->take(100)
  ->all();

// Великий CSV
$users = LazyCollection::make(function () {
  $h = fopen('users.csv', 'r');
  while ($line = fgets($h)) {
    yield $line;
  }
  fclose($h);
})->map(fn($l) => str_getcsv($l));

// cursor() - вже lazy
User::cursor();
Завантаження...