Создание виртуального столбца в базе данных в Laravel

Источник: «Laravel Create Virtual Database Column»
Виртуальные столбцы необходимы, когда требуется добавить в модель столбец, не существующий в базе данных. Это может быть необходимо для таких вещей, как вычисляемые столбцы, или для столбцов, являющихся производными от других столбцов.

Зачем нужны виртуальные столбцы

Недавно возникла ситуация, когда было необходимо добавить виртуальный столбец в модель, который был производным от других столбцов в модели. Я не хотел хранить этот столбец в базе данных, поскольку он был бы избыточным и требовал дополнительного обслуживания.

Эти данные брались из столбца JSON, в котором нужно было искать значение. Я не хотел извлекать это значение и хранить его отдельно в другом столбце, поскольку мне нужно, чтобы оно оставалось синхронизированным с JSON. Но я хотел выполнить поиск по этому столбцу и иметь возможность индексировать столбец для повышения производительности, а не искать в JSON.

Создание виртуального столбца

Чтобы создать новый виртуальный столбец в MySQL из столбца JSON, можно использовать функцию JSON_EXTRACT. Эта функция позволяет извлечь значение из столбца JSON и использовать его в качестве виртуального столбца.

Вот пример, как можно создать виртуальный столбец в MySQL:

ALTER TABLE `users` ADD COLUMN `email` VARCHAR(255) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(`data`, '$.email'))) VIRTUAL;

В этом примере в таблицу users добавляется новый виртуальный столбец email. Этот столбец является производным от столбца data, представляющего собой столбец JSON. Для извлечения поля email из JSON и сохранения его в столбце email используется функция JSON_EXTRACT.

Использование виртуальных столбцов в Laravel

Сначала необходимо создать миграцию для добавления виртуального столбца в таблицу. Вот пример создания миграции для добавления виртуального столбца в таблицу в Laravel:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class AddVirtualColumnToUsersTable extends Migration
{
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('email')->virtualAs("JSON_UNQUOTE(JSON_EXTRACT(`data`, '$.email'))");
});
}

public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('email');
});
}
}

В этом примере создаётся новая миграция AddVirtualColumnToUsersTable, добавляющая виртуальный столбец email в таблицу users. С помощью метода virtualAs указывается выражение, используемое для создания виртуального столбца.

Создав миграцию, её можно выполнить с помощью команды php artisan migrate. Это добавит виртуальный столбец в таблицу.

Использование виртуального столбца в Laravel

Теперь, когда виртуальный столбец добавлен в таблицу, его можно использовать в приложении Laravel, как и любой другой столбец.

$user = User::where('email', 'test@email.com')->first();

В этом примере используется виртуальный столбец email для поиска пользователя с заданным адресом электронной почты.

Доступ к этому столбцу можно получить так же, как и к любому другому столбцу в модели:

$user = User::find(1);
echo $user->email;

В этом примере осуществляется доступ к виртуальному столбцу email в модели User.

Заключение

В статье рассмотрено, как создать виртуальный столбец в базе данных в Laravel. Виртуальные столбцы удобны, когда необходимо добавить в модель столбец, не существующий в базе данных. Это может быть целесообразно для таких вещей, как вычисляемые столбцы, или для столбцов, являющихся производными от других столбцов.

Дополнительные материалы

Предыдущая Статья

Полиморфные модели Laravel по типам

Следующая Статья

Утверждение структуры JSON ответа в Laravel