Создание виртуального столбца в базе данных в Laravel
Зачем нужны виртуальные столбцы
Недавно возникла ситуация, когда было необходимо добавить виртуальный столбец в модель, который был производным от других столбцов в модели. Я не хотел хранить этот столбец в базе данных, поскольку он был бы избыточным и требовал дополнительного обслуживания.
Эти данные брались из столбца 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. Виртуальные столбцы удобны, когда необходимо добавить в модель столбец, не существующий в базе данных. Это может быть целесообразно для таких вещей, как вычисляемые столбцы, или для столбцов, являющихся производными от других столбцов.