Перебор связанных данных в CakePHP

#php #cakephp

#php #cakephp

Вопрос:

Я нащупываю свой путь через CakePHP, пытаясь воспроизвести то, что я уже могу делать в ванильном PHP.

У меня есть 2 таблицы, events и eventlist . events содержит общую информацию о событии. eventlist содержит информацию, которая отображается в виде списка с маркерами на каждой странице события.

eventlist состоит из идентификатора, event_id, который связывает каждую запись с соответствующим событием в event таблице, и строки, которая отображается на странице. В ванильном PHP я бы просто SELECT list_info FROM eventlist WHERE event_id = 1 или как угодно, и перебирал результирующий массив.

Однако я понятия не имею, с чего начать с этого в CakePHP, и я не уверен, как я буду искать это, чтобы узнать.

Я уже создал связь между двумя таблицами:

 class Event extends AppModel{

    public $hasMany = array(
        'EventList'
        );

}
  

список событий класса расширяет AppModel{

 public $useTable = 'eventlist';

public $belongsTo = array(
    'Event'
);
  

}

И у меня есть простое представление, настроенное для Event :

 <h2><?php echo $event['Event']['event_name'] ?></h2>

<p><?php echo $event['Event']['event_description']?></p>

<h3>£<?php echo $event['Event']['event_cost']?></p>
  

Но теперь я понятия не имею, что делать — я новичок в CakePHP и MVC в целом. Я предполагаю, что мне нужно что-то EventListController сделать, чтобы загрузить данные в массив. Любая помощь приветствуется.

Ответ №1:

По умолчанию настроенные вами отношения должны возвращать связанные данные при запросе события. Существует несколько способов получить данные в отображаемом формате, например, с помощью HTML helper для вывода (не) упорядоченного списка. Но приведенный ниже пример должен помочь.

Кроме того, быстрый способ отладки результатов поиска записи в вашем контроллере — использовать pr (псевдоним для print_r) like pr($event);exit; . Есть и другие способы отладки, но это быстрый и грязный метод, если вы работаете локально.

Контроллер

 $event = $this->Event->findById(`event_id`);
$this->set(compact('event'));
  

Вид

 <h2><?php echo $event['Event']['event_name'] ?></h2>
<p><?php echo $event['Event']['event_description']?></p>
<p>£<?php echo $event['Event']['event_cost']?></p>
<!-- Output each list item in a paragraph -->
<p>
    <?php foreach($event['EventList'] as $listItem:
       echo $listItem['ListItemColumn'];
    endforeach; ?>
</p>
  

Снова…много-много способов получить и вывести эти данные, но суть в том, что возвращаемые результаты должны иметь ключ массива Event и ключ массива EventList с данными из каждой таблицы, хранящимися в этих ключах.

Комментарии:

1. Я знал, что это будет просто, но это просто, только если вы знаете синтаксис 🙂 Спасибо.

2. Дополнительный вопрос: таким образом, я могу вывести EventList в неупорядоченный список: echo $this->Html->nestedList($listItem); но при этом выводится вся таблица, включая ключи. Как я могу просто вывести строку column ( event_list ) в свой список?

3. Это тоже можно обработать несколькими способами. Самым простым может быть установка fields параметра в вашем запросе на return id и name объекта EventList . Затем используйте помощник HTML для вывода списка типа $this-> Html-> list($event[‘EventList’]); Или вы можете запросить список событий отдельно в вашем контроллере в виде списка и использовать помощник HTML: $eventList = $this->Event->EventList->find('list', ['conditions' => ['event_id' => $event_id]]);

4. В первом примере я предполагаю, что я устанавливаю это в моем EventListController ? который на данный момент пуст (кроме объявления класса).