Ama*_*wat 3 php cakephp cakephp-3.0
我使用list来从模型中获取数据并且效果很好
这个例子来自Cakephp docs
$query = $articles->find('list', [
'keyField' => 'slug',
'valueField' => 'title'
]);
$data = $query->toArray();
Run Code Online (Sandbox Code Playgroud)
我有一个表名假期
id [int] | 日期[日期] | name [varchar(200)] | 创建了[日期时间]
所以想要一个将日期作为关键字和假期作为价值的列表
[
'2016-01-01'=>'New Year',
'2016-01-26'=>'Republic Day',
]
Run Code Online (Sandbox Code Playgroud)
所以我通过蛋糕烘焙创建模型并使用此代码来实现它
$holidays = TableRegistry::get('Holidays');
$holidays = $holidays->find('list',[
'keyField' => 'date',
'valueField'=>'name',
])->toArray();
Run Code Online (Sandbox Code Playgroud)
但它给了我错误
非法偏移类型InvalidArgumentException
当我使用名称从日期更改keyField时效果很好.
这是日志
2016-04-29 04:26:41错误:[InvalidArgumentException]非法偏移类型请求URL:/ sfworxerp/api/attendances/getMonthAttendanceData堆栈跟踪:F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\Collection\Iterator\MapReduce.php(160):Cake\Collection\Iterator\MapReduce :: emit()F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\Collection\CollectionTrait.php(386):Cake\Collection\Iterator\MapReduce-> emit('New Year',Object(Cake\I18n\FrozenDate))F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\Collection\Iterator\MapReduce.php(177):Cake\ORM\ResultSet - > Cake\Collection {closure}(Object(App\Model\Entity\Holiday),0,Object(Cake\Collection\Iterator\MapReduce))F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\Collection\Iterator\MapReduce.php(132):Cake\Collection\Iterator\MapReduce - > _ execute()[内部函数]:Cake\Collection\Iterator\MapReduce-> getIterator()F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\Collection\Collection.php(50):IteratorIterator - > __ construct(Ob ject(Cake\Collection\Iterator\MapReduce))F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\Collection\CollectionTrait.php(405):Cake\Collection\Collection - > __ construct(Object(Cake\Collection \) Iterator\MapReduce))F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\ORM\Table.php(1062):Cake\ORM\ResultSet-> combine('date','name',NULL)F:\public_html\sfworxerp\vendor\cakephp\cakephp\src\Datasource\QueryTrait.php(490):Cake\ORM\Table-> Cake\ORM {closure}(Object(Cake\ORM\ResultSet))F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\ORM\Query.php(1141):Cake\ORM\Query - > _ applyDecorators(Object(Cake\ORM\ResultSet))F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\Datasource\QueryTrait.php(272):Cake\ORM\Query - > _ decorateResults(Object(Cake\ORM\ResultSet))F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\ORM\Query.php( 871):Cake\ORM\Query - > _ all()F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\Datasource\QueryTrait.php(288):Cake\ORM\Query-> all()F:\的public_html\sfworxerp\SRC \控制 ler\Api\AttendancesController.php(133):Cake\ORM\Query-> toArray()[内部函数]:App\Controller\Api\AttendancesController-> getMonthAttendanceData()F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\Controller\Controller.php(429):call_user_func_array(Array,Array)F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\Routing\Dispatcher.php(114):Cake\Controller\Controller-> invokeAction ()F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\Routing\Dispatcher.php(87):Cake\Routing\Dispatcher - > _ invoke(Object(App\Controller\Api\AttendancesController))F:\ public_html\sfworxerp\webroot\index.php(37):Cake\Routing\Dispatcher-> dispatch(Object(Cake\Network\Request),Object(Cake\Network\Response)){main}
任何帮助都非常感谢
问题:
问题是,对于'date'字段,CakePHP 3返回一个对象,而不是一个字符串:
'date' => object(Cake\I18n\FrozenDate) {
'time' => '1997-01-03T00:00:00+00:00',
'timezone' => 'UTC',
'fixedNowTime' => false
},
Run Code Online (Sandbox Code Playgroud)
尝试将其用作密钥不起作用,并抛出您所看到的错误.
如何处理:
根据CakePHP书中的这个区域,为了适应这一点,您可以:
使用闭包来访问列表中的实体mutator方法.
TLDR这样做:
$query = $articles->find('list', [
'keyField' => function ($e) {
return $e->date->format('Y-m-d');
},
'valueField' => 'title'
]);
Run Code Online (Sandbox Code Playgroud)
它的工作原理说明:
基本上,它将每个实体的值(在您的情况下为每个文章)放入变量中$e,并允许您使用/修改它的数据,并返回您要用作键(或值)字段的字符串.在上面的例子中,它获取date对象,并在返回它之前将其格式化为字符串以用作键.