Так что мне нужно получить данные из нескольких таблиц, и у меня возникают проблемы с этим.
У меня есть два модельных класса:
- Thesis_Supervisor: имеет идентификатор руководителя и идентификатор диссертации
- Дипломная работа: имеет всю информацию о диссертации (идентификатор, тема, автор ...)
Что я хочу сделать, так это, учитывая идентификатор руководителя, я хочу знать, какой тезис он возглавляет, и всю информацию о тезисе.
Вот мой код:
в контроллере Thesis Supervisor у меня есть эта функция:
public function listOfThesisBySupervisor($id=null){
$result = $this->ThesisSupervisor->find('all', [
'conditions' => ['supervisor_id' => $id],
]);
$resultset=array();
foreach($result as $row){
$this->loadModel('Theses');
$query = $this->Theses->find('all');
array_push($resultset,$query->where(['id' => $row->these_id])->toArray());
}
$this->set('Thesis', $resultset);
}
}
эта функция:
- получение всех тезисов, связанных с данным руководителем
- использует foreach для прохождения различных тезисов
- сохраняет информацию о тезисах в переменной resultset
- возвращает его в представление
вот код в представлении:
<div class="thesis index large-9 medium-8 columns content">
<h3><?= __('Thesis') ?></h3>
<table cellpadding="0" cellspacing="0">
<thead>
<tr>
<th scope="col"><?= $this->Paginator->sort('id') ?></th>
<th scope="col"><?= $this->Paginator->sort('sujet') ?></th>
<th scope="col"><?= $this->Paginator->sort('type') ?></th>
<th scope="col"><?= $this->Paginator->sort('date_debut') ?></th>
<th scope="col"><?= $this->Paginator->sort('date_fin') ?></th>
<th scope="col"><?= $this->Paginator->sort('signature') ?></th>
<th scope="col"><?= $this->Paginator->sort('auteur_id') ?></th>
<th scope="col" class="actions"><?= __('Actions') ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($Theses as $thesis): ?>
<tr>
<td><?= $this->Number->format($thesis->id) ?></td>
<td><?= h($thesis->subject) ?></td>
<td><?= h($thesis->type) ?></td>
<td><?= h($thesis->beginning) ?></td>
<td><?= h($thesis->ending) ?></td>
<td><?= h($thesis->sign) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
Итак, с помощью этого кода я нахожу правильное количество результатов, но они не распознаются в представлении, я получаю этот тип ошибки для каждого поля диссертации:
Trying to get property 'id' of non-object
Я пытался сделать это с помощью множества различных синтаксисов (я пытался удалить -> toArray в foreach, чтобы получить объект, но у меня была неопределенная ошибка свойства для каждого поля диссертации), но ни один из них не работал. Я думаю, что проблема заключается в добавлении результатов каждого цикла foreach в переменную resultset, но я не вижу, как это исправить ...
РЕДАКТИРОВАТЬ: как предложил ndm в своем комментарии, я больше посмотрел на ассоциации (поскольку мои модельные классы связаны вместе с ассоциациями) и вот мой окончательный код:
$result = $this->ThesisSupervisor->find('all', [
'conditions' => ['supervisor_id' => $id],
'contain' => ['Thesis']
]);
$resultset=array();
foreach ($result as $row){
$resultset[]=$row["thesis"];
}
$this->set('Theses', $resultset);
это намного проще, чем мой оригинальный код и работает отлично.