Использование внешнего ключа в цикле с Symfony - PullRequest
0 голосов
/ 19 января 2012

У меня есть три таблицы.Два используют внешний ключ, который извлекает данные, а другой - данные.

Мои таблицы выглядят следующим образом:

department:
id: 1  name: illustration
id: 2  name  photography
etc...

type:
id: 1  name: ink
id: 2  name: charcoal
etc...

user:
id: 1 firstname: Fred    lastname: Flintstone
id: 2 firstname: Barney  lastname: Rubble
etc....

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

Например:

Illustration
ink       Fred Flintstone
charcoal  Fred Flintstone
painting  Fred Flintstone

Photography
ink      Barney Rubble
painting Barney Rubble

То, что у меня есть, работает, но я думаю, что это может быть выполнено намного лучше.Вот что у меня работает:

apps / frontend / modules / foo / actions / actions.class.php

public function executeIndex(sfWebRequest $request)
  {
    $this->illustration = Doctrine_Core::getTable('User')
      ->createQuery('a')
      ->where('a.department_id = 1')
      ->execute();

    $this->photography = Doctrine_Core::getTable('User')
      ->createQuery('a')
      ->where('a.department_id = 2')
      ->execute();
 }

И в индексе apps / frontend / modules / foo / templates/indexSuccess.php

<?php foreach ($illustration as $user): ?>
      <tr>
        <td class="displayDept" valign="top"><?php echo $user->getDepartment() ?></td>
    </tr>
    <tr>
    <?php foreach ($illustration as $user): ?>
    <tr>
      <td class="displayInfo" valign="top"><?php echo $user->getType() ?></td>
      <td class="displayInfo" valign="top"><?php echo $user->getUrl() ?></td>
      <td class="displayInfo" valign="top"><?php echo simple_format_text($user->getDescription()) ?></td>
      <td class="displayInfo" valign="top"><?php echo $user->getDateTimeObject('created_at')->format('m/d/Y') ?></td>
    </tr>
    <?php endforeach; ?>

   <?php endforeach; ?>
     <tr>
    <?php foreach ($photography as $me): ?>
    <tr>
        <td class="displayDept" valign="top"><?php echo $me->getDepartment() ?></td>
    </tr>
    <?php foreach ($photography as $me): ?>
    <tr>
      <td class="displayInfo" valign="top"><?php echo $me->getType() ?></td>
      <td class="displayInfo" valign="top"><?php echo $me->getUrl() ?></td>
      <td class="displayInfo" valign="top"><?php echo simple_format_text($me->getDescription()) ?></td>
      <td class="displayInfo" valign="top"><?php echo $me->getDateTimeObject('created_at')->format('m/d/Y') ?></td>
    </tr>
    <?php endforeach; ?>
     <?php endforeach; ?>

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

Есть ли способ получить все данные отдела с опцией WHERE для последующих данныхв строке?

ОБНОВЛЕНИЕ

Вот схема, которая, я думаю, довольно близка к предложенной @ManseUK:

Department:
 actAs: { Timestampable: ~ }
 columns:
  id: { type: integer(4), primary: true, autoincrement: true }
  name: { type: string(255), notnull: true, unique: true }

Type:
 actAs: { Timestampable: ~ }
 columns:
  id: { type: integer(4), primary: true, autoincrement: true }
  name: { type: string(255), notnull: true, unique: true }
  user_id: { type: integer(4) }

User:
 actAs: { Timestampable: ~ }
 columns:
  id: { type: integer(4), primary: true, autoincrement: true }
  firstname: { type: string(255), notnull: true }
  lastname: { type: string(255), notnull: true }
  email: { type: string(255), notnull: true, unique: true }
  department_id: { type: integer(4), notnull: true }
  type_id: { type: integer(4), notnull: true }
  url: { type: string(255), notnull:true }
  description: { type: string(4000) }
 relations:
  Department: { class: Department, local: department_id, foreign: id }
  Type: { class: Type, local: type_id, foreign: id, foreignAlias: Users }

1 Ответ

1 голос
/ 19 января 2012

Не видя свой schema.yml, трудно сказать, но если вы правильно настроили псевдонимы в схеме, вы сможете сделать что-то вроде:

actions.php

public function executeIndex(sfWebRequest $request)
{
    $this->departments = Doctrine_Core::getTable('departments')
      ->findAll(); 
    // returns all departments or you could change this to just select departments by name / id
}

indexSuccess.php

<?php foreach ($departments as $dept): ?>
      <tr>
        <td class="displayDept" valign="top"><?php echo $dept->getName() ?></td>
    </tr>
    <tr>
    <?php foreach ($dept->getUsers() as $user): ?>
    <tr>
      <td class="displayInfo" valign="top"><?php echo $user->getType() ?></td>
      <td class="displayInfo" valign="top"><?php echo $user->getUrl() ?></td>
      <td class="displayInfo" valign="top"><?php echo simple_format_text($user->getDescription()) ?></td>
      <td class="displayInfo" valign="top"><?php echo $user->getDateTimeObject('created_at')->format('m/d/Y') ?></td>
    </tr>
    <?php endforeach; ?>
   <?php endforeach; ?>

schema.yml

Department:
  columns:
    id:
      type: integer
      primary: true
      autoincrement: true
    name: String(25)
Type:
  columns:
    id:
      type: integer
      primary: true
      autoincrement: true
    name: String(25)
User:
  columns:
    id:
      type: integer
      primary: true
      autoincrement: true
    firstname: string(25)
    lastname: string(25)
    department: integer
    type: integer
    relations:
      Department:
        class: Department
        local: department
        foreign: id
        foreignAlias: Users
      Type:
        class: Type
        local: type
        foreign: id
        foreignAlias: Users

Параметр foreignAlias является ключевым здесь - он определяет имя отношения между таблицами - что позволяет вам звонить $dept->getUsers() - который возвращает всех пользователей для определенного отдела

...