Хранение массива или std-объекта в базе данных приложения laravel

Что такое схема для таблицы базы данных для хранения Array или stdObject в столбце?

Когда я использую → string и вставляю переменную массива, он сохраняет только слово "Array" в столбце db.

У Laravel есть поддержка массива?

Если нет, какую методологию следует реализовать?

Ответы

Ответ 1

Вы можете сохранить/вставить сериализованные данные в поле типа TEXT, но для этого вам нужно что-то использовать с помощью php, например:

$arr = array('x', 'y', 'z');

Чтобы вставить это в поле базы данных, вы можете использовать serialize функцию, подобную этой

$serializedArr = serialize($arr);

Теперь вы можете вставить массив $serializedArr в базу данных и когда вы извлекаете данные для использования, просто unserialize, используя somethig вроде:

$record = SomeModel::find(1);
unserialize($record->field_name);

Кроме того, вы можете использовать Laravel accessors-and-mutators, чтобы автоматизировать все это, проверить руководство, оно мертво просто. Если вам нужна дополнительная помощь в этом accessors-and mutators, оставьте сообщение с данными table.

Update:

Так как Laravel 5.x позволяет отличать атрибуты, чтобы можно было придать атрибуты другому типу данных для преобразования во время выполнения. В этом случае просто объявите свойство protected $casts, например:

protected $casts = [
    'is_admin' => 'boolean', // Will convarted to (Bool)
    'options' => 'array', // Will convarted to (Array)
];

Листинг array особенно полезен для работы с столбцами, которые хранятся как сериализованные JSON. Например, если ваша база данных имеет поле типа TEXT, которое содержит сериализованный JSON, добавление массива, переданного этому атрибуту, автоматически десериализует атрибут в массив php при его доступе к вашей модели Eloquent, а также его " Если вы установите значение для этого свойства, это будет автоматически сериализовано до JSON, например:

$user = User::find(1);

// $options is an array...
$options = $user->options;

// options is automatically serialized back to JSON...
$user->options = ['foo' => 'bar'];

Ответ 2

Лучший способ - CAST для вашего поля таблицы следующим образом:

class Mytable extends Model
{
    /**
     * The attributes that should be casted to native types.
     *
     * @var array
     */
    protected $casts = [
        'my_field' => 'array',
    ];

Подробнее о создании атрибутов на странице официальных страниц в Laravel. Цитата:

Свойство $casts на вашей модели обеспечивает удобный способ преобразование атрибутов в общие типы данных. Свойство $casts должно быть массивом, где ключ - это имя атрибута, а значение - тип, который вы хотите отправить в столбец. поддерживаемые типы литья: integer, real, float, double, string, boolean, object, массив, сбор, дата и дата-время.

Единственное ограничение, которое docs не говорит, что вы не можете работать с этим массивом напрямую, например

$myTable.my_field[]='new array element';

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

$temp=[];
$temp[]='new array element';
$myTable.my_field[]=$temp;