Передача результатов sql в представления жестких кодов в имена столбцов базы данных - PullRequest
1 голос
/ 17 апреля 2010

Я только что понял, что, возможно, я не следую передовым методам в отношении шаблона MVC.

Моя проблема в том, что мои взгляды "знают" информацию о моей базе данных

Вот моя ситуация с кодом псевдо ...

Мой контроллер вызывает метод из моей модели и передает его непосредственно в представление

view.records = tableGateway.getRecords() // gets array of records
view.display()

на мой взгляд

each records as record
    print record.name
    print record.address
    ...

На мой взгляд, у меня есть запись. имя и запись. адрес , информация, жестко запрограммированная в моей базе данных. Это плохо?

Какие еще способы существуют, кроме как перебирать все в контроллере и переписывать коллекцию записей? И это кажется глупым.

Спасибо


EDIT
Вот фактический вид
<?php foreach( $categories as $category ): ?>
    <tr>
        <td><?php echo $category['name'] ?> </td>
        <td><?php echo $category['fields'] ?> </td>
        <td><?php echo $category['records'] ?></td>
        <td><a href="/category/view/<?php echo $category['id'] ?>/<?php echo url::title( $category['name'] ) ?>/">View</a></td>
    </tr>
<?php endforeach; ?>

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

Есть ли способ обойти это? Это заставляет меня чувствовать себя грязным.

Ответы [ 2 ]

1 голос
/ 17 апреля 2010

С помощью методов получения / установки и фрагмента кода для сопоставления полей записей с ними вы можете удалить это, но вы добавите некоторую сложность.

Реальный вопрос: нужно ли вообще переименовывать имена полей?

При некотором планировании / размышлении / обратной связи не составит труда найти подходящие названия для ваших полей, которые выдержат время жизни приложений. Однако, если семантика поля изменится, вы должны добавить новое поле. Это также дает то преимущество, что вы можете четко задокументировать его устаревание и привести программиста к новому.

1 голос
/ 17 апреля 2010

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

Но подумайте о том, чтобы иметь общий класс для представлений с методом, который берет ваши данные из базы данных, и некоторый массив, описывающий, какие столбцы использовать. Затем в дочерних классах (UserView, PostView, Wh whatTableNameView) вы можете вызвать этот базовый метод с массивом, содержащим «Имя», «Адрес» и т. Д.

Извините, если я говорю о тарабарстве Python, я пришел к этому вопросу из тега PHP;) Более или менее так

class BaseView {
   public function display(& $data, array $columnNames) {
      foreach($data as $row) {
         foreach($columnNames as $c) {
            echo $row->$c; // or $row[$c] or whatever your data is, I'm assuming objects
         }
      echo "\n";
   }
}

class UserView extends BaseView{
    public function display(& $data) {
        parent::display($data, array('Name', 'Address');
    }
}

Хорошие вещи здесь:

  • Нужна еще одна колонка? Убедитесь, что вы запрашиваете его, затем измените 1 строку в UserView.
  • Нужен текст для меток столбцов HTML (
  • $ data может быть дескриптором ресурса (например, while ($ rs.nextRow ())) и не обязательно полным массивом, который может занимать много памяти и занимать время для передачи из одной функции в другую.
  • если вы посмотрите на HTML-таблицы вокруг этих записей, у вас будет единое представление о приложении, поскольку вы можете определить их только в одном месте.

Если по какой-то причине это вам не подходит, то по-настоящему общим решением является использование индексов вместо имен столбцов. $ data [$ i] [0], $ data [$ i] [1] и т. д. Большинство API баз данных предоставляют возможность запрашивать столбцы в виде имен, чисел или обоих. Для PHP + MySQL см. Примеры на http://www.php.net/manual/en/function.mysql-fetch-array.php

Но это рано или поздно укусит вас в $$, потому что вы потеряете информацию метаданных. Допустим, вы хотите позже обернуть свои «имена» в ссылки:

echo '<a href="user/',$record['id'],'">',$record['name'],'</a>';

Удачи в повторном использовании без имен столбцов ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...