Невидимые столбцы MySQL и как их определить с помощью Laravel и Doctrine
Многие разработчики не знают, что MySQL теперь поддерживает невидимые столбцы.
Но что такое невидимый столбец?
Когда это происходит?
Этот атрибут доступен в MySQL начиная с версии 8.0.23. Согласно документации:
Невидимый столбец обычно скрыт для запросов, но к нему можно получить доступ, если на него явно есть ссылка. До MySQL 8.0.23 все столбцы были видимы.
Синтаксис создания невидимого столбца очень прост:
create table employees (
id int not null primary key auto_increment,
name varchar(45) not null,
ssn char(11) not null INVISIBLE
) ENGINE = InnoDB;
Конечно, мы можем использовать DDL для переключения столбца между видимым и невидимым.
alter table employees alter column ssn set visible;
Запрос данных
А что произойдет, если я выполню select * from employees
?
Ого, где моя колонка SSN
? Ну оно спрятано 🙂! Чтобы получить этот столбец, нам нужно явно указать его в нашем запросе:
Это хороший подход для исключения столбцов, которые не нужно отображать в нашем запросе, например тех, которые содержат конфиденциальные данные.
Создание невидимого столбца с помощью миграции Laravel
Если вы хотите использовать эту функцию в приложении Laravel, вы можете определить свой столбец следующим образом:
public function up(): void
{
Schema::create('employees', function (Blueprint $table) {
$table->id();
$table->string('name', 45);
$table->char('ssn', 11)->invisible();
});
}
Создание невидимого столбца с помощью Doctrine
Я определил сущность под названием Employee
со следующей конфигурацией
#[ORM\Entity]
#[ORM\Table(name: 'employees')]
class Employee
{
#[ORM\Id]
#[ORM\Column(type: 'integer')]
#[ORM\GeneratedValue]
private int | null $id;
#[ORM\Column(type: 'string', length: 45)]
private string $name;
#[ORM\Column(columnDefinition: 'char(11) INVISIBLE')]
private string $ssn;
// The other methods of this entity
}
Теперь у нас есть дополнительный уровень безопасности, предотвращающий раскрытие наших конфиденциальных данных!
Вот и все, ребята! Увидимся в следующем посте 🙂 👍🏻