Cakephp3.7中select查询中的深层关联

时间:2019-04-17 06:55:35

标签: cakephp associations cakephp-3.7

我是Cakephp3的新手。我无法加入关联的表数据。我有

  1. 员工表。
  2. EmployeeLogins表
  3. EmployeeCategories表

关系: 员工表hasMany EmployeeLogins 和EmployeeLogins登录到EmployeeCategories

我正在使用包含但未获取EmployeeCategories数据。

我想要的结果就像 在单个结果集中

输出:

array(
    'Employees' => array(
        'id' => 123,
    ),
    'EmployeeLogin' => array(
        [0] => array(
            'employee_id' => 123,
            'last_login' => '2019-01-01',
            'category_id' => 3,
            'EmployeeCategory' => array(
                'id' => 3,
                'category_name' => 'contract'
            )
        )
    )
)

EmployeesTable.php

public function initialize(array $config)
{
    parent::initialize($config);
    $this->setTable('employees');
    $this->setDisplayField('id');
    $this->setPrimaryKey('id');
    $this->addBehavior('Timestamp');
    $this->hasMany('EmployeeLogins', [
        'foreignKey' => 'user_id',
        'dependent' => true
    ]);
}

EmployeeLoginsTable.php

public function initialize(array $config)
{
    parent::initialize($config);
    $this->setTable('employee_logins');
    $this->setDisplayField('name');
    $this->setPrimaryKey('id');
    $this->belongsTo('Categories', [
        'foreignKey' => 'category_id',
    ]);
}

EmployeeCategoriesTable.php

public function initialize(array $config)
{
    parent::initialize($config);
    $this->setTable('employee_catgories');
    $this->setDisplayField('id');
    $this->setPrimaryKey('id');
    $this->addBehavior('Timestamp');
}

控制器中的代码

$Employees = TableRegistry::get('Employees');
$EmployeeLogins = TableRegistry::get('EmployeeLogins');
$EmployeeCategories = TableRegistry::get('EmployeeCategories');
$Employees->hasMany('EmployeeLogins', [
    'className' => 'EmployeeLogins',
    'foreignKey' => 'employee_id',
    'propertyName' => 'employee_logins'
]);
$Employees->EmployeeLogins->belongsTo('EmployeeCategories', [
    'className' => 'EmployeeCategories',
    'conditions' => [
        'EmployeeLogins.category_id' => 'EmployeeCategories.id'
    ],
    'propertyName' => 'employee_categores',
]);

$result = $Employees
    ->find()
    ->where([
        'Employees.user_id)' => $user_id,
    ])
    ->contain([
        'EmployeeLogins' => [
            'EmployeeCategories'
        ]
    ])
    ->all();

1 个答案:

答案 0 :(得分:1)

您需要像下面一样更改您的包含部分

$result = $Employees
->find()
->where([
    'Employees.user_id)' => $user_id,
])
->contain([
    'EmployeeLogins', 'EmployeeLogins.EmployeeCategories'
])
->all();
相关问题