Codeigniter 4实体属性强制转换为未自动序列化的数组



我正试图将实体属性强制转换为数组,以便它自动序列化。

实体设置如下

\App\Entitys\Submission.php

<?php
namespace AppEntities;
use CodeIgniterEntity;
class Submission extends Entity
{
protected $casts =[
'field2' => 'array'
];
}

然后在控制器中,我创建一个新的实体,使用构造函数填充它

<?php
$allowedFromPost = [
'field1'=>'value1',
'field2'=>[0,1],
];
$submission = new AppEntitiesSubmission($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 AppEntitiesSubmission($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页面上的PR
我将接受Kulshreshth K的回答,因为目前,这提供了一个足够的解决方案,但在未来很可能不需要它。

将其添加到您的实体中:

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

控制器:

$allowedFromPost = [
'field1'=>'value1',
'field2'=>[0,1],
];
$submission = new AppEntitiesSubmission($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 AppEntities;
use CodeIgniterEntity;
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);

相关内容

  • 没有找到相关文章

最新更新