Метод sequence
Метод sequence применяется к фабрике Eloquent-модели и позволяет переопределять значения атрибутов для каждого создаваемого экземпляра в виде последовательности. Метод принимает массив или замыкание, которое возвращает значение для текущей позиции в последовательности. Это особенно полезно при тестировании, когда необходимо создать несколько записей с различными, но предсказуемыми значениями полей.
Синтаксис
<?php
Factory::sequence($values);
?>
Метод sequence вызывается после метода count и до методов create или make. Параметром передаётся массив значений, которые будут последовательно присваиваться указанному полю. Количество элементов в массиве должно соответствовать количеству создаваемых записей, либо можно использовать замыкание для динамического вычисления значения.
Пример
Создадим трёх пользователей с последовательными именами:
<?php
namespace Tests\Unit;
use Tests\TestCase;
use App\Models\User;
class UserTest extends TestCase
{
public function test_sequence_of_names()
{
$users = User::factory()
->count(3)
->sequence(
['name' => 'user_1'],
['name' => 'user_2'],
['name' => 'user_3']
)
->create();
foreach ($users as $user) {
echo $user->name . "\n";
}
}
}
?>
Результат выполнения кода:
"user_1"
"user_2"
"user_3"
Пример
Используем последовательность для генерации инкрементальных номеров заказов:
<?php
namespace Tests\Unit;
use Tests\TestCase;
use App\Models\Order;
class OrderTest extends TestCase
{
public function test_sequence_of_order_numbers()
{
$orders = Order::factory()
->count(5)
->sequence(function ($sequence) {
return [
'order_number' => 'ORD-' . ($sequence->index + 1)
];
})
->create();
foreach ($orders as $order) {
echo $order->order_number . "\n";
}
}
}
?>
Результат выполнения кода:
"ORD-1"
"ORD-2"
"ORD-3"
"ORD-4"
"ORD-5"
Пример
Используем несколько последовательностей для разных полей одновременно:
<?php
namespace Tests\Unit;
use Tests\TestCase;
use App\Models\Product;
class ProductTest extends TestCase
{
public function test_sequence_of_products()
{
$products = Product::factory()
->count(4)
->sequence(
['name' => 'prod_a', 'price' => 100],
['name' => 'prod_b', 'price' => 200],
['name' => 'prod_c', 'price' => 300],
['name' => 'prod_d', 'price' => 400]
)
->create();
foreach ($products as $product) {
echo $product->name . ' - ' . $product->price . "\n";
}
}
}
?>
Результат выполнения кода:
"prod_a - 100"
"prod_b - 200"
"prod_c - 300"
"prod_d - 400"