Codeigniter 4 Свойство Entity, приведенное как массив, не автосериализующий - PullRequest
5 голосов
/ 02 мая 2020

Я пытаюсь преобразовать свойство объекта в массив, чтобы оно автоматически сериализовалось.

Объект настроен следующим образом

\ 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, потому что пока это обеспечивает адекватный обходной путь, но в будущем он, скорее всего, не понадобится.

1 Ответ

0 голосов
/ 05 мая 2020

Добавьте это в свою сущность:

public function __construct($arr) {
   $this->field2 = $arr['field2'];
}

Контроллер:

$allowedFromPost = [
'field1'=>'value1',
'field2'=>[0,1],
];

$submission = new \App\Entities\Submission($allowedFromPost);
var_dump($submission)

Результат:

["attributes":protected]=>
  array(2) {
    ["field1"]=>
    string(6) "value1"
    ["field2"]=>
    string(22) "a:2:{i:0;i:0;i:1;i:1;}"
  }

В соответствии с документацией CI вам необходимо установить его после инициализируйте его модель в любом случае:

<?php namespace App\Entities;

use CodeIgniter\Entity;

class User extends Entity
{
    protected $casts => [
        'options' => 'array',
                'options_object' => 'json',
                'options_array' => 'json-array'
    ];
}

$user    = $userModel->find(15);
$options = $user->options;

$options['foo'] = 'bar';

$user->options = $options;
$userModel->save($user);
...