CakePHP过滤深度关联的查找

时间:2015-09-25 10:46:24

标签: cakephp cakephp-3.0

我有一个深度关联的查找,一个关联正在检索modules_employees的无关的无关记录。

我应该在courses_modules下只看到modules_employees的一条记录,但它检索的很多,因为它们可以是course_modules_id的很多但只有一个带有courses_employee_id。

modules_employees表

'id' => (int) 18,
'courses_employee_id' => (int) 31,
'course_module_id' => (int) 7,
'completed_on' => null,

CoursesEmployee->课程 - > course_modules-> modules_employees

CoursesEmployeesController.php

public function player($id = null)
{
    $coursesEmployee = $this->CoursesEmployees->get($id, [
        'contain' =>
            [
                'Employees',
                'Courses',
                'CourseModules',
                'Courses.CourseModules',
                'Courses.CourseModules.ModulesEmployees',
                'Courses.CourseFiles'
            ]
    ]);
    $this->set('coursesEmployee', $coursesEmployee);
    debug($coursesEmployee);
    $this->set('_serialize', ['coursesEmployee']);
}

当前的find对象,当我应该有一个时,你会看到其中一个course_modules有两个modules_employees。

object(App\Model\Entity\CoursesEmployee) {

  'id' => (int) 31,
  'employee_id' => (int) 3,
  'course_id' => (int) 3,
  'course_module_id' => (int) 7,
  'course_module' => object(App\Model\Entity\CourseModule) {

    'id' => (int) 7,
    'course_id' => (int) 3,
    'name' => 'Module 2',

  },
  'course' => object(App\Model\Entity\Course) {

    'id' => (int) 3,
    'name' => 'Treacys Hotel Induction Training',
    'course_files' => [
      (int) 0 => object(App\Model\Entity\CourseFile) {

        'id' => (int) 2,
        'name' => 'Manual_Handling_doc.txt',
        'type' => 'doc',

      }
    ],
    'course_modules' => [
      (int) 0 => object(App\Model\Entity\CourseModule) {

        'id' => (int) 6,
        'course_id' => (int) 3,
        'name' => 'Module 1',
        'module_order' => (int) 1,
        'modules_employees' => [
          (int) 0 => object(App\Model\Entity\ModulesEmployee) {

            'id' => (int) 1,
            'courses_employee_id' => (int) 0,
            'course_module_id' => (int) 6,
            'started_on' => object(Cake\I18n\Time) {

              'time' => '2015-09-08T04:16:16+0000',
              'timezone' => 'UTC',
              'fixedNowTime' => false

            },
            'completed_on' => object(Cake\I18n\Time) {

              'time' => '2015-09-09T08:22:16+0000',
              'timezone' => 'UTC',
              'fixedNowTime' => false

            },
            'completed' => true,
            'deleted' => null,
            '[new]' => false,
            '[accessible]' => [
              'employee_id' => true,
              'module_id' => true,
              'started_on' => true,
              'completed_on' => true,
              'completed' => true,
              'employee' => true,
              'module' => true
            ],
            '[dirty]' => [],
            '[original]' => [],
            '[virtual]' => [],
            '[errors]' => [],
            '[repository]' => 'ModulesEmployees'

          }
        ],
        '[repository]' => 'CourseModules'

      },
      (int) 1 => object(App\Model\Entity\CourseModule) {

        'id' => (int) 7,
        'course_id' => (int) 3,
        'name' => 'Module 2',
        'module_order' => (int) 2,
        'modules_employees' => [
          (int) 0 => object(App\Model\Entity\ModulesEmployee) {

            'id' => (int) 2,
            'courses_employee_id' => (int) 31,
            'course_module_id' => (int) 7,
            'started_on' => object(Cake\I18n\Time) {

              'time' => '2015-09-17T00:00:00+0000',
              'timezone' => 'UTC',
              'fixedNowTime' => false

            },
            'completed_on' => null,
            '[repository]' => 'ModulesEmployees'

          },
          (int) 1 => object(App\Model\Entity\ModulesEmployee) {

            'id' => (int) 18,
            'courses_employee_id' => (int) 32,
            'course_module_id' => (int) 7,
            'started_on' => object(Cake\I18n\Time) {

              'time' => '2015-09-17T00:00:00+0000',
              'timezone' => 'UTC',
              'fixedNowTime' => false

            },
            'completed_on' => null,
            '[repository]' => 'ModulesEmployees'

          }
        ],

        '[repository]' => 'CourseModules'

      },

    ],
  },
  'employee' => object(App\Model\Entity\Employee) {

    'id' => (int) 3,
    'user_id' => (int) 4,

  },

  '[repository]' => 'CoursesEmployees'

}

1 个答案:

答案 0 :(得分:0)

你应该考虑匹配

http://book.cakephp.org/3.0/en/orm/query-builder.html#filtering-by-associated-data

$query =  $this->CoursesEmployees->findById($id)
   ->contain(['Your_Models_You_Wanna_Contain'])
   ->matching('Courses.CourseModules.ModulesEmployees', function ($q) use ($id) {
        return $q->where(['courses_employee_id' => $id]);
    });

如果没有匹配,那么你也不会得到一个CourseEmployee,如果你仍然需要你也可以使用contains:

http://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html#passing-conditions-to-contain

$query = $this->CoursesEmployees->findById($id)->contain([
    'Courses.CourseModules.ModulesEmployees' => function ($q) use ($id) {
       return $q
            ->where(['courses_employee_id' => $id]);
    }
]);