перенос кода CakePHP 2.5 для использования объектов CakePHP 3.0

1

Я переношу приложение 2.5 в cakePHP 3.0, и я обновляю свой код, чтобы использовать объекты ORM после find() а не массивы.

В моем представлении 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'];}
                                        )
                            );?>
Теги:
cakephp
cakephp-3.0

1 ответ

1
Лучший ответ

Кажется мне хорошо, но вы можете сделать счет через find в своем коде действий.

чтобы избежать соединения, вы можете использовать метод доступа к объекту...

<?= $completedCourses = count(
                            array_filter(
                                $recentEmployee->courses,
                                function($item){return $item->completed;}
                                        )
                            );?>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню