Поле json
Поле json в миграциях Laravel позволяет хранить структурированные данные в формате JSON. Это удобно для хранения наборов параметров, настроек или любых других данных, которые не требуют отдельной таблицы. При использовании поля json база данных автоматически проверяет корректность JSON-структуры. Для работы с такими полями в запросах существуют специальные методы.
Синтаксис
<?php
Schema::table('table_name', function (Blueprint $table) {
$table->json('column_name');
});
?>
Пример
Давайте создадим таблицу 'products' с полем 'options' типа json:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateProductsTable extends Migration
{
public function up()
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->json('options')->nullable();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('products');
}
}
?>
Пример
Давайте создадим модель Product с указанием приведения типов:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
protected $fillable = [
'name',
'options',
];
protected $casts = [
'options' => 'array',
];
}
?>
Благодаря $casts, при чтении поле 'options' автоматически превращается в массив, а при записи - обратно в JSON.
Пример
Давайте сохраним продукт с JSON-данными:
<?php
namespace App\Http\Controllers;
use App\Models\Product;
class ProductController extends Controller
{
public function store()
{
$product = new Product();
$product->name = 'Laptop';
$product->options = [
'color' => 'silver',
'size' => '15 inch',
'weight' => '2.5 kg',
];
$product->save();
return $product;
}
}
?>
Результат выполнения кода:
"Product saved successfully with JSON data"
Пример
Давайте обновим конкретное поле в JSON-структуре:
<?php
namespace App\Http\Controllers;
use App\Models\Product;
class ProductController extends Controller
{
public function update()
{
$product = Product::find(1);
$options = $product->options;
$options['color'] = 'black';
$product->options = $options;
$product->save();
return $product;
}
}
?>
Пример
Давайте отфильтруем продукты по значению внутри JSON-поля с использованием whereJsonContains:
<?php
namespace App\Http\Controllers;
use App\Models\Product;
class ProductController extends Controller
{
public function index()
{
$products = Product::whereJsonContains('options->color', 'silver')->get();
foreach ($products as $product) {
echo $product->name . "\n";
}
}
}
?>
Результат выполнения кода:
"Laptop"
"Tablet"
Пример
Давайте отфильтруем продукты по длине JSON-массива с использованием whereJsonLength:
<?php
namespace App\Http\Controllers;
use App\Models\Product;
class ProductController extends Controller
{
public function index()
{
$products = Product::whereJsonLength('options', 3)->get();
foreach ($products as $product) {
echo $product->name . "\n";
}
}
}
?>
Результат выполнения кода:
"Laptop"
"Smartphone"
Смотрите также
-
метод
whereJsonContains,
который проверяет наличие значения в JSON-массиве -
метод
whereJsonLength,
который фильтрует по длине JSON-массива -
метод
text,
который создаёт текстовое поле в таблице -
метод
casts,
который задаёт приведение типов в моделях