Как отображать только строки с foreignAlias, которые установлены в Symfony 1.4 - PullRequest
1 голос
/ 20 января 2012

У меня есть список из трех таблиц: Отдел, Тип и Пользователь.

Отображается так:

Film 
student      Jimmy Stewart
faculty      Cary Grant

из actions.class.php

$this->departments = Doctrine_Core::getTable('Department')
        ->createQuery('a')
        ->orderBy('a.name')
        ->execute();

indexSuccess.php

<?php foreach ($departments as $dept): ?>
      <tr>
        <?php check_for_id() ?>
        <td colspan="4" 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"><a href="<?php echo $user->getUrl() ?>" target="_blank"><?php echo $user->getUrl() ?></a></td>
      <td class="displayInfo" valign="top"><?php echo simple_format_text($user->getDescription()) ?></td>
    </tr>
    <?php endforeach; ?>
   <?php endforeach; ?>

Однако это приводит к тому, что foreach вытягивает все идентификаторы из таблицы отдела, оставляя несколько пустых строк под дисплеем отдела. Как это:

Photography
student      Keanu Reeves
faculty      Lawrence Fishburn

Drawing

Film 
    student      Jimmy Stewart
    faculty      Cary Grant

Painting

Sculpture

Можно ли удалить отделы, у которых нет идентификатора пользователя?

UPDATE

Если я собираюсь использовать соединение, как мне это назвать в действиях? Вот где я до сих пор, но ни одна из моих итераций не работает:

$this->departments = Doctrine_Core::getTable('Department')
        ->createQuery('a')
        ->leftJoin('a.Users p')
        ->orderBy('a.name ASC')
        ->execute();

Хотя я не уверен, что он делает. Я могу понять ГДЕ, как это было бы в традиционном PHP, но я не могу следовать синтаксису Symfony. Я даже близко?

Ответы [ 2 ]

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

Почему бы не сделать это в запросе, отдел объединяется с пользователями?

UPDATE

это от макушки моей головы, но должно быть что-то вроде этого:

$this->departments = Doctrine_Core::getTable('Department')
        ->createQuery('a')
        ->leftJoin('a.Users p')
        ->groupBy('a.id')
        ->having('COUNT(a.id) > 0')
        ->orderBy('a.name ASC')
        ->execute();
0 голосов
/ 22 января 2012

Влад правильно понял, я просто сделал несколько твиков и хотел опубликовать это для других.

Вот файл actions.class.php

$this->departments = Doctrine_Query::create()
        ->select('d.id')
        ->from('Department d')
        ->leftJoin('d.Users u')
        ->groupBy('d.id')
        ->having('COUNT(u.id) > 0')
        ->orderBy('d.name ASC')
        ->execute();

Я также отредактировал schema.yml

Department:
 actAs: { Timestampable: ~ }
 columns:
  id: { type: integer(4), primary: true, autoincrement: true }
  name: { type: string(255), notnull: true, unique: true }
 relations:
  User: {class: User, local: name, foreign: department_id, foreignAlias: Departments}

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, foreignAlias: Users}
  Type: { class: Type, local: type_id, foreign: id, foreignAlias: Users }

И это прекрасно сработало. Спасибо за дальнейшее объяснение псевдонима букв. Это все еще немного туманно, так как кажется, что эти буквы просто составлены. Я выбрал d для отдела и u для пользователей, и я не уверен, что это очень важно. Спасибо @Vlad за помощь!

...