Codeigniter 4 实体 属性 转换为数组而不是自动序列化
Codeigniter 4 Entity Property cast as array not autoserializing
我正在尝试将一个实体 属性 转换成一个数组,以便它自动序列化。
实体设置如下
\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()
,因此没有发生自动序列化。请参阅 Codeigniter Github 页面 here 上的 PR。
我将接受 Kulshreshth K 的回答,因为目前,这提供了一个足够的解决方法,但将来很可能不需要它。
在您的实体中添加:
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);
我正在尝试将一个实体 属性 转换成一个数组,以便它自动序列化。
实体设置如下
\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()
,因此没有发生自动序列化。请参阅 Codeigniter Github 页面 here 上的 PR。
我将接受 Kulshreshth K 的回答,因为目前,这提供了一个足够的解决方法,但将来很可能不需要它。
在您的实体中添加:
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);