Я пытаюсь преобразовать свойство объекта в массив, чтобы оно автоматически сериализовалось.
Объект настроен следующим образом
\ App \ Entities \ Submission. php
<?php
namespace App\Entities;
use CodeIgniter\Entity;
class Submission extends Entity
{
protected $casts =[
'field2' => 'array'
];
}
Затем в контроллере я создаю новую сущность, заполняя ее с помощью конструктора
<?php
$allowedFromPost = [
'field1'=>'value1',
'field2'=>[0,1],
];
$submission = new \App\Entities\Submission($allowedFromPost);
?>
Дамп представления в этой точке (var_dump ()) показывает, что field2 - это массив, это не сериализовано.
["attributes":protected]=>
array(2) {
["field1"]=>
string(6) "value1"
["field2"]=>
array(2) {
[0]=>
int(0)
[1]=>
int(1)
}
}
если я сделаю
$allowedFromPost = [
'field1'=>'value1',
'field2'=>[0,1],
];
$submission = new \App\Entities\Submission($allowedFromPost);
$submission->field2 = $submission->field2;
и затем var_dump, поле field2 будет правильно сериализовано.
["attributes":protected]=>
array(2) {
["field1"]=>
string(6) "value1"
["field2"]=>
string(22) "a:2:{i:0;i:0;i:1;i:1;}"
}
По какой-то причине это выглядит как заполнение использование конструктора не выполняет автосериализацию, я должен вручную установить поле. Я делаю что-то не так?
Проблема, которую это вызвало, заключается в том, что когда я пытался вставить эту сущность в базу данных, она выдавала ошибку, говорящую
"mysqli_sql_exception Operand should contain 1 column(s)
"
, который исчез, когда я сгладил массив (сначала отбрасывая все тесты, кроме одного, а затем используя то, что я сделал выше)
========= =======
РЕДАКТИРОВАТЬ 11/05: Это оказалось проблемой в основном коде. fill()
(и конструктор) не были настроены на использование __set()
, поэтому автосериализация не выполнялась. Смотрите PR на странице Codeigniter's Github здесь .
Я приму ответ Kulshreshth K, потому что пока это обеспечивает адекватный обходной путь, но в будущем он, скорее всего, не понадобится.