Поле char
Метод char используется в миграциях Laravel для создания колонки типа CHAR в базе данных. Первым параметром передаётся имя колонки, вторым - длина строки в символах. Если длина не указана, по умолчанию используется значение 255. В отличие от string, поле char всегда занимает фиксированное количество места в базе данных, что может быть полезно для хранения коротких строк с известной длиной, например, кодов, сокращений или флагов.
Синтаксис
<?php
Schema::create('table_name', function (Blueprint $table) {
$table->char('column_name', $length);
});
?>
Пример
Давайте создадим миграцию для таблицы продуктов с полем для кода продукта фиксированной длины:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->char('code', 10);
$table->string('name');
$table->integer('price');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('products');
}
};
?>
В результате выполнения миграции будет создана таблица с полем code типа CHAR(10):
CREATE TABLE products (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
code char(10) NOT NULL,
name varchar(255) NOT NULL,
price int(11) NOT NULL,
created_at timestamp NULL DEFAULT NULL,
updated_at timestamp NULL DEFAULT NULL,
PRIMARY KEY (id)
);
Пример
Создадим миграцию для таблицы пользователей с полем для двухбуквенного кода страны:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->char('country_code', 2);
$table->char('language_code', 2)->nullable();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('users');
}
};
?>
Результат выполнения миграции:
CREATE TABLE users (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
email varchar(255) NOT NULL UNIQUE,
country_code char(2) NOT NULL,
language_code char(2) DEFAULT NULL,
created_at timestamp NULL DEFAULT NULL,
updated_at timestamp NULL DEFAULT NULL,
PRIMARY KEY (id)
);
Пример
Используем метод char вместе с другими модификаторами для создания поля с дополнительными ограничениями:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('orders', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained();
$table->char('status', 1)->default('A');
$table->char('priority', 1)->nullable();
$table->string('description');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('orders');
}
};
?>
В результате будет создана таблица с полями статуса и приоритета фиксированной длины:
CREATE TABLE orders (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
user_id bigint(20) unsigned NOT NULL,
status char(1) NOT NULL DEFAULT 'A',
priority char(1) DEFAULT NULL,
description varchar(255) NOT NULL,
created_at timestamp NULL DEFAULT NULL,
updated_at timestamp NULL DEFAULT NULL,
PRIMARY KEY (id),
KEY orders_user_id_foreign (user_id),
CONSTRAINT orders_user_id_foreign FOREIGN KEY (user_id) REFERENCES users (id)
);
Пример
Теперь создадим модель и наполним базу данных тестовыми записями:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
protected $fillable = ['code', 'name', 'price'];
}
?>
<?php
namespace Database\Seeders;
use App\Models\Product;
use Illuminate\Database\Seeder;
class ProductSeeder extends Seeder
{
public function run(): void
{
Product::create([
'code' => 'PRD001',
'name' => 'Laptop',
'price' => 999
]);
Product::create([
'code' => 'PRD002',
'name' => 'Smartphone',
'price' => 599
]);
Product::create([
'code' => 'PRD003',
'name' => 'Tablet',
'price' => 399
]);
}
}
?>
Выполним запрос к таблице продуктов:
<?php
use App\Models\Product;
use Illuminate\Support\Facades\Route;
Route::get('/products', function () {
$res = Product::all();
foreach ($res as $product) {
echo $product->code . ' - ' . $product->name . ' (' . $product->price . ')' . "\n";
}
});
?>
Результат выполнения кода:
"PRD001 - Laptop (999)"
"PRD002 - Smartphone (599)"
"PRD003 - Tablet (399)"