Как получить данные из двух таблиц, используя foreach Используя CakePHP - PullRequest
0 голосов
/ 22 апреля 2019

Так что мне нужно получить данные из нескольких таблиц, и у меня возникают проблемы с этим.

У меня есть два модельных класса:

  • 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);

это намного проще, чем мой оригинальный код и работает отлично.

...