在Cakephp 3列表中将Date设置为keyField
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Cakephp 3列表中将Date设置为keyField,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4077字,纯文字阅读大概需要6分钟。
内容图文
![在Cakephp 3列表中将Date设置为keyField](/upload/InfoBanner/zyjiaocheng/750/5f076efd428f4ff5b5d4651e51b2450c.jpg)
我使用list来从模型中获取数据并且效果很好
这个例子来自Cakephp docs
$query = $articles->find('list', [
'keyField' => 'slug',
'valueField' => 'title'
]);
$data = $query->toArray();
我有一个表名假期
id[int] | date[date] | name[varchar(200)] | created[datetime]
所以想要一个以日期为关键字,假日为价值的清单
像这样的东西
[
'2016-01-01'=>'New Year',
'2016-01-26'=>'Republic Day',
]
所以我通过蛋糕烘焙创建了模型,并使用此代码来实现它
$holidays = TableRegistry::get('Holidays');
$holidays = $holidays->find('list',[
'keyField' => 'date',
'valueField'=>'name',
])->toArray();
但它给了我错误
Illegal offset type
InvalidArgumentException
当我使用名称从日期更改keyField时效果很好.
这是日志
2016-04-29 04:26:41 Error: [InvalidArgumentException] Illegal offset
type Request URL: /sfworxerp/api/attendances/getMonthAttendanceData
Stack Trace:
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() [internal function]:
Cake\Collection\Iterator\MapReduce->getIterator()
F:\public_html\sfworxerp\vendor\cakephp\cakephp\src\Collection\Collection.php(50):
IteratorIterator->__construct(Object(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\Controller\Api\AttendancesController.php(133):
Cake\ORM\Query->toArray() [internal function]:
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
},
尝试将其用作密钥不起作用,并抛出您所看到的错误.
如何处理:
每this area in the CakePHP book,为了适应这一点,你可以:
use closures to access entity mutator methods in your list finds.
TLDR这样做:
$query = $articles->find('list', [
'keyField' => function ($e) {
return $e->date->format('Y-m-d');
},
'valueField' => 'title'
]);
它的工作原理说明:
基本上,它将每个实体的值(在您的情况下为每个文章)放入变量$e,并允许您使用/修改它的数据,并返回您要用作键(或值)字段的字符串.在上面的例子中,它获取日期对象,并在返回它之前将其格式化为字符串以用作键.
内容总结
以上是互联网集市为您收集整理的在Cakephp 3列表中将Date设置为keyField全部内容,希望文章能够帮你解决在Cakephp 3列表中将Date设置为keyField所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。