Как показать данные из другой таблицы с внешним ключом CakePHP? - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть следующие таблицы:

  1. пользователи: идентификатор, имя, ...
  2. курсы: идентификатор, имя, Knowledge_area_id, Educational_institution_id, ...
  3. users_courses: user_id, course_id, ...
  4. Knowledge_areas: ID, имя
  5. Educational_institutions: ID, имя, ...

Я сейчас пытаюсьотображать на экране пользователей некоторую информацию об этом пользователе, включая каждый курс, с которым он связан.Вот что я сейчас делаю:

Вкл. /Template/Users/view.ctp:

<?php foreach($user->courses as $courses): ?>
    <?= h($courses->name) ?>
    <?= h($courses->knowledge_area_id) ?>
    <?= h($courses->educational_institution_id ?>
    <?= h($courses->description) ?>
<?php endforeach; ?>

Показывает каждый курс, с которым связан пользователь, с его именем, идентификатором области знаний, идентификатором учебного заведенияи описание курса.Однако я хотел бы показать название области знаний и название учебного заведения вместо их удостоверения личности.Я пытался сделать $courses->knowledge_area->name, но там говорится, что я пытаюсь получить свойство name от Необъекта.

Когда я пытаюсь debug($courses), я получаю:

object(App\Model\Entity\Course) {

    'id' => (int) 2,
    'name' => 'course name',
    'knowledge_area_id' => (int) 1,
    'educational_institution_id' => (int) 1,
    'description' => 'course description',
    '_joinData' => object(Cake\ORM\Entity) {
    ...
}

Когда на самом деле я должен получить

object(App\Model\Entity\Course) {

    'id' => (int) 2,
    'name' => 'course name',
    'knowledge_area_id' => (int) 1,
    'educational_institution_id' => (int) 1,
    'description' => 'course description',
    'educational_institution' => object(App\Model\Entity\EducationalInstitution) {

        'id' => (int) 1,
        'address_id' => (int) 1,
        'name' => 'ed institution name',
        '[new]' => false,
        '[accessible]' => [
            'address_id' => true,
            'name' => true,
            'address' => true,
            'courses' => true,
            'users' => true
        ],
        '[dirty]' => [],
        '[original]' => [],
        '[virtual]' => [],
        '[errors]' => [],
        '[invalid]' => [],
        '[repository]' => 'EducationalInstitutions'

    },
    'knowledge_area' => object(App\Model\Entity\KnowledgeArea) {

        'id' => (int) 1,
        'name' => 'knowledge area name',
        '[new]' => false,
        '[accessible]' => [
            'name' => true,
            'courses' => true
        ],
        '[dirty]' => [],
        '[original]' => [],
        '[virtual]' => [],
        '[errors]' => [],
        '[invalid]' => [],
        '[repository]' => 'KnowledgeAreas'

    },
...
}

Таким образом, я смогу использовать $courses->knowledge_area->name, что в основном и происходит в /Template/Courses/view.ctp, где для каждого курса я могу показать, к какой области знаний он относится.

Поскольку я следую правилам торта и дважды проверил файлы, которые у меня естьпри условии, что все на /Model/Table/.. и на контроллерах верно, есть идеи, что я мог бы сделать, чтобы это исправить?

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

С помощью комментария Мэри мне удалось найти немного другое решение, которое работало для меня.

Поскольку я пытался редактировать представление пользователей, я вошел в функцию просмотра на контроллере пользователей и изменил

$user = $this->Users->get($id, [ 'contain' => ['Addresses', 'AccessLevels', 'Courses', 'EducationalInstitutions' ] ]);

до

$user = $this->Users->get($id, [ 'contain' => ['Addresses', 'AccessLevels', 'Courses', 'EducationalInstitutions', 'Courses.KnowledgeAreas', 'Courses.EducationalInstitutions' ] ]);

0 голосов
/ 29 сентября 2018

Вы можете настроить загрузку настолько глубоко, насколько пожелаете, используя contain():

$query = $products->find()->contain([
    'Shops.Cities.Countries',
    'Shops.Managers'
]);

См. Здесь: https://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html#eager-loading-associations-via-contain

...