Глубокие ассоциации в запросе выбора в cakephp3.7 - PullRequest
0 голосов
/ 17 апреля 2019

Я новичок в cakephp3. Я не могу присоединиться к данным связанных таблиц. У меня

  1. Таблица сотрудников.
  2. Таблица EmployeeLogins
  3. Таблица сотрудников категории

Отношение: Таблица сотрудников имеет много сотрудников И EmployeeLogins belognsTo 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 Ответ

1 голос
/ 03 мая 2019

Вам необходимо изменить раздел содержимого, как показано ниже

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