迁移 cakephp 2.5 代码以使用 cakephp 3.0 对象
migrating cakephp 2.5 code to use cakephp 3.0 objects
我将一个 2.5 应用程序迁移到 cakePHP 3.0,我正在更新我的代码以在 find()
之后使用 ORM 对象而不是数组。
在我的 2.5 视图中,我执行数组查找并计算结果。但是我似乎无法访问我需要在新代码中进行计数的对象级别。
2.5代码:
<?php foreach ($recentEmployees as $recentEmployee): ?>
<tr>
<td>
<?php echo ($recentEmployee['Employee']['name']); ?>
</td>
<td><?php echo h($this->Time->format('d/m/Y', $recentEmployee['Employee']['created'])); ?></td>
<td>
<?php
$completedCourses = count(
array_filter(
$recentEmployee['Course'],
function($item){return $item['CoursesEmployee']['completed'];}
)
);
$totalCourse = count($recentEmployee['Course']);
?>
<span class="label <?php echo($label); ?>">
<?php
echo ($completedCourses);
?>
/<?php echo ($totalCourse); ?>
</td>
</tr>
<?php endforeach; ?>
现在我的 3.0 代码和我正在尝试访问和计数的对象:
<?php foreach ($recentEmployees as $recentEmployee): ?>
<tr>
<td><?= h($recentEmployee->name) ?></td>
<td><?= h($this->Time->format($recentEmployee->created, 'd/M/Y')) ?></td>
<td><?= debug($recentEmployee->courses) ?></td>
</tr>
<?php endforeach; ?>
对象:
[
(int) 0 => object(App\Model\Entity\Course) {
'id' => (int) 1,
'name' => 'Manual Handling Training',
'course_lenght' => object(Cake\I18n\Time) {
'time' => '2015-05-28T02:12:00+0000',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'_joinData' => object(App\Model\Entity\CoursesEmployee) {
'course_id' => (int) 1,
'id' => (int) 1,
'employee_id' => (int) 1,
'course_module_id' => (int) 5,
'progress' => (int) 10,
'modified' => object(Cake\I18n\Time) {
'time' => '2014-12-16T22:40:42+0000',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'created' => object(Cake\I18n\Time) {
'time' => '2014-11-18T00:00:00+0000',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'completed' => false,
'[new]' => false,
'[accessible]' => [
'employee_id' => true,
'course_id' => true,
'course_module_id' => true,
'progress' => true,
'completed' => true,
'employee' => true,
'course' => true,
'course_module' => true
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[repository]' => 'CoursesEmployees'
},
'[new]' => false,
'[accessible]' => [
'name' => true,
'course_lenght' => true,
'course_files' => true,
'course_modules' => true,
'employees' => true
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[repository]' => 'Courses'
},
(int) 1 => object(App\Model\Entity\Course) {
'id' => (int) 3,
'name' => 'Treacys Hotel Induction Training',
'course_lenght' => object(Cake\I18n\Time) {
'time' => '2015-05-28T01:25:00+0000',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'_joinData' => object(App\Model\Entity\CoursesEmployee) {
'course_id' => (int) 3,
'id' => (int) 2,
'employee_id' => (int) 1,
'course_module_id' => (int) 8,
'progress' => (int) 100,
'modified' => object(Cake\I18n\Time) {
'time' => '2014-12-08T00:07:18+0000',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'created' => object(Cake\I18n\Time) {
'time' => '2014-11-20T00:00:00+0000',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'completed' => true,
'[new]' => false,
'[accessible]' => [
'employee_id' => true,
'course_id' => true,
'course_module_id' => true,
'progress' => true,
'completed' => true,
'employee' => true,
'course' => true,
'course_module' => true
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[repository]' => 'CoursesEmployees'
},
'[new]' => false,
'[accessible]' => [
'name' => true,
'course_lenght' => true,
'course_files' => true,
'course_modules' => true,
'employees' => true
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[repository]' => 'Courses'
},
]
我试过了,但是对象和数组乱七八糟
$completedCourses = count(
array_filter(
$recentEmployee->courses,
function($item){return $item['CoursesEmployee']['completed'];}
)
);
****更新
我已经通过指向 _jointable 访问了数据。这肯定不是最佳做法?
<?= $completedCourses = count(
array_filter(
$recentEmployee->courses,
function($item){return $item['_joinData']['completed'];}
)
);?>
我觉得没问题,但您可以通过在操作代码中查找来进行计数。
要避免连接,您可以使用对象访问方法...
<?= $completedCourses = count(
array_filter(
$recentEmployee->courses,
function($item){return $item->completed;}
)
);?>
我将一个 2.5 应用程序迁移到 cakePHP 3.0,我正在更新我的代码以在 find()
之后使用 ORM 对象而不是数组。
在我的 2.5 视图中,我执行数组查找并计算结果。但是我似乎无法访问我需要在新代码中进行计数的对象级别。
2.5代码:
<?php foreach ($recentEmployees as $recentEmployee): ?>
<tr>
<td>
<?php echo ($recentEmployee['Employee']['name']); ?>
</td>
<td><?php echo h($this->Time->format('d/m/Y', $recentEmployee['Employee']['created'])); ?></td>
<td>
<?php
$completedCourses = count(
array_filter(
$recentEmployee['Course'],
function($item){return $item['CoursesEmployee']['completed'];}
)
);
$totalCourse = count($recentEmployee['Course']);
?>
<span class="label <?php echo($label); ?>">
<?php
echo ($completedCourses);
?>
/<?php echo ($totalCourse); ?>
</td>
</tr>
<?php endforeach; ?>
现在我的 3.0 代码和我正在尝试访问和计数的对象:
<?php foreach ($recentEmployees as $recentEmployee): ?>
<tr>
<td><?= h($recentEmployee->name) ?></td>
<td><?= h($this->Time->format($recentEmployee->created, 'd/M/Y')) ?></td>
<td><?= debug($recentEmployee->courses) ?></td>
</tr>
<?php endforeach; ?>
对象:
[
(int) 0 => object(App\Model\Entity\Course) {
'id' => (int) 1,
'name' => 'Manual Handling Training',
'course_lenght' => object(Cake\I18n\Time) {
'time' => '2015-05-28T02:12:00+0000',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'_joinData' => object(App\Model\Entity\CoursesEmployee) {
'course_id' => (int) 1,
'id' => (int) 1,
'employee_id' => (int) 1,
'course_module_id' => (int) 5,
'progress' => (int) 10,
'modified' => object(Cake\I18n\Time) {
'time' => '2014-12-16T22:40:42+0000',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'created' => object(Cake\I18n\Time) {
'time' => '2014-11-18T00:00:00+0000',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'completed' => false,
'[new]' => false,
'[accessible]' => [
'employee_id' => true,
'course_id' => true,
'course_module_id' => true,
'progress' => true,
'completed' => true,
'employee' => true,
'course' => true,
'course_module' => true
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[repository]' => 'CoursesEmployees'
},
'[new]' => false,
'[accessible]' => [
'name' => true,
'course_lenght' => true,
'course_files' => true,
'course_modules' => true,
'employees' => true
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[repository]' => 'Courses'
},
(int) 1 => object(App\Model\Entity\Course) {
'id' => (int) 3,
'name' => 'Treacys Hotel Induction Training',
'course_lenght' => object(Cake\I18n\Time) {
'time' => '2015-05-28T01:25:00+0000',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'_joinData' => object(App\Model\Entity\CoursesEmployee) {
'course_id' => (int) 3,
'id' => (int) 2,
'employee_id' => (int) 1,
'course_module_id' => (int) 8,
'progress' => (int) 100,
'modified' => object(Cake\I18n\Time) {
'time' => '2014-12-08T00:07:18+0000',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'created' => object(Cake\I18n\Time) {
'time' => '2014-11-20T00:00:00+0000',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'completed' => true,
'[new]' => false,
'[accessible]' => [
'employee_id' => true,
'course_id' => true,
'course_module_id' => true,
'progress' => true,
'completed' => true,
'employee' => true,
'course' => true,
'course_module' => true
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[repository]' => 'CoursesEmployees'
},
'[new]' => false,
'[accessible]' => [
'name' => true,
'course_lenght' => true,
'course_files' => true,
'course_modules' => true,
'employees' => true
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[repository]' => 'Courses'
},
]
我试过了,但是对象和数组乱七八糟
$completedCourses = count(
array_filter(
$recentEmployee->courses,
function($item){return $item['CoursesEmployee']['completed'];}
)
);
****更新
我已经通过指向 _jointable 访问了数据。这肯定不是最佳做法?
<?= $completedCourses = count(
array_filter(
$recentEmployee->courses,
function($item){return $item['_joinData']['completed'];}
)
);?>
我觉得没问题,但您可以通过在操作代码中查找来进行计数。
要避免连接,您可以使用对象访问方法...
<?= $completedCourses = count(
array_filter(
$recentEmployee->courses,
function($item){return $item->completed;}
)
);?>