web-dev-qa-db-ja.com

Codeigniter 4エンティティプロパティが配列としてキャストされ、自動シリアル化されません

エンティティプロパティを配列にキャストして自動シリアル化しようとしています。

エンティティは次のように設定されています

\ 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)"

これは、配列をフラット化したときになくなりました(最初に1つを除くすべての値をドロップしてテストし、次に上記で行った方法を使用しました)。

================
EDIT 11/05:これはコアコードの問題であることが判明しました。 fill()(およびコンストラクター)は__set()を使用するように構成されていないため、自動シリアル化は行われていませんでした。 CodeigniterのGithubページのPRを参照してください here
現時点ではこれで十分な回避策が提供されるため、クルシュレシュKの回答を受け入れますが、将来的には必要なくなる可能性が高くなります。

5

これをエンティティに追加します。

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);
0
Kulshreshth K