Фишки и трюки в Laravel #4


Проверка на возврат отношений

Распространённой ошибкой считается пропуск оператора возврата return при определении отношений.

Чтобы этого избежать, можно указать возвращаемый тип. Это также помогает при статическом анализе.

// До
public function user()
{
    $this->belongsTo(User::class);
}

// После
public function user(): BelongsTo
{
    return $this->belongsTo(User::class);
}

via: @TheLaravelDev и Laravel Daily


Пара методов для работы с фабриками в Laravel

Вы можете вызвать make() вместо create(), чтобы получить экземпляр без сохранения в базе данных.

// Создать пользователя без сохранения в БД
User::factory()->make();

// Создать пользователя с сохранением в БД
User::factory()->create();


Как сделать редирект на анкор по имени роута?

Для редиректа на анкор по имени роута нужно к редиректу добавить метод withFragment().

//..
return redirect()->route('post.show', $post)->withFragment('comments');
//..


Четырёхуровневый seeder

Допустим нужно создать демо-данные в базе данных для следующих моделей с отношениями: Заказчик → заказы → продукты → ингридиенты.

// DatabaseSeeder.php

//...
public functiob run()
{
    Customer::factory(100)
        ->has(Order::factory(2)
            ->has(Product::factory(3)
                ->has(Ingridient::factory(5))
                )
        )
        ->create();
}
//...

Получить подстроку определённой длины

Moshe Brodsky добавил в классы Str и Stringable метод take(), который является синтаксическим сахаром для substr(), когда необходимо начать с первого символа:

// До
str('abcdef')->substr(0, 2) // 'ab'
Str::substr('abcdef', 0, 2); // 'ab'

// После
str('abcdef')->take(2) // 'ab'
Str::take('abcdef', 2); // 'ab'

Ещё один возможность применения — начать отсчёт от конца строки:

str('Lineharo WebDev')->take(8);     // Lineharo
str('Lineharo WebDev')->take(-6);    // WebDev


Объединение методов в Eloquent

В Eloquent можно объединить whereHas() и orDoesntHave() в одном предложении.

User::whereHas('roles', function($query) {
    $query->where('id', 1);
})
->orDoesntHave('roles')
->get();

Этот пример читается почти как правильное предложение на английском.