Как использовать доктрину или пейджер Symfony с разными столбцами, выбранными из нескольких таблиц - PullRequest
0 голосов
/ 12 декабря 2010

Как реализовать разбиение на страницы с помощью Doctrine_Pager или sfDoctrinePager, когда мой запрос выбирает несколько столбцов из двух или более таблиц?


Редактировать1:

Хорошо, теперь я понял, что это можно сделать так, как Натан описал ниже! Я запутался, так как не смог получить определенные данные из запроса! Позвольте мне описать это ниже:

Это мой пейджинговый запрос:

        $pager = new sfDoctrinePager('sfGuardUser', '5'); 

        $q = Doctrine_Query::create()
                        ->select('u.id, u.username,  p.org_name,  g.name, l.status')
                        ->from('sfGuardUser u')
                        ->leftJoin('u.Profile p')
                        ->leftJoin('u.Groups g')
                        ->leftJoin('u.LicensedVendors l')
                        ->where('g.name = \'client\'');

        $pager->setQuery($q);
        $pager->setPage($request->getParameter('page', 1));
        $pager->init();

Теперь в моем шаблоне я могу получить данные своего sfGuardUser и профиля, например:

 foreach ($pager->getResults() as $data) {


            echo $data->username ;  //outputs 'username' from sfGuardUser table
            echo '<br />' ;
            echo $data->Profile->org_name ; //outputs 'Organization name' from sfGuardUserProfile table 

} 

Я неправильно пытался получить данные профиля по $data->org_name, а не $data->Profile->org_name! Теперь он правильно работает для этой части, , но проблема все еще существует !

Мне все еще не удается получить данные Groups & LicensedVendors , используя $data->Groups->name или $data->LicensedVendors->status! Он не показывает ни ошибки, ни какого-либо значения! Похоже, он выводит пустую строку. Разве это не должно получить значение так же, как данные профиля? Но когда я hydrate запрос, установив:

$q->setHydrationMode(Doctrine_Core::HYDRATE_SCALAR);

Я могу получить все данные через:

foreach ($pager->getResults() as $data) {

      echo $data['u_username'];
      echo $data['p_org_name'];
      echo $data['g_name'];
      echo $data['l_status'];
}

Как получить эти данные без установки **Doctrine_Core::HYDRATE_SCALAR**? Где я делаю неправильно для получения этих групп и LicensedVendors данных таблицы?

Вот определение схемы таблиц, описанных выше:

License:
  actAs: [Timestampable]
  tableName: licenses
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
      autoincrement: true
    status:
      type: enum
      values: ['approved','pending_admin','pending_client','pending_vendor','rejected']
      default: 'pending'
    client_id:
      type: integer(8)
      notnull: true
    vendor_id:
      type: integer(8)
      notnull: true
    product_desc:
      type: clob(16777215)
    supplier_name:
      type: string(80)
    other_desc:
      type: string(50)
    financial_statement:
      type: clob
  relations:
    VendorUser:
      class: sfGuardUser
      local: client_id
      foreign: id
      foreignAlias: LicensedVendors
      onDelete: cascade
      foreignType: many
      owningSide: true
    ClientUser:
      class: sfGuardUser
      local: vendor_id
      foreign: id
      foreignAlias: LicensedClients
      onDelete: cascade
      foreignType: many
      owningSide: true


sfGuardUser:
      actAs: [Timestampable]
      columns:
        first_name: string(255)
        last_name: string(255)
        email_address:
          type: string(255)
          notnull: true
          unique: true
        username:
          type: string(128)
          notnull: true
          unique: true
        algorithm:
          type: string(128)
          default: sha1
          notnull: true
        salt: string(128)
        password: string(128)
        is_active:
          type: boolean
          default: 1
        is_super_admin:
          type: boolean
          default: false
        last_login:
          type: timestamp
      indexes:
        is_active_idx:
          fields: [is_active]
      relations:
        Groups:
          class: sfGuardGroup
          local: user_id
          foreign: group_id
          refClass: sfGuardUserGroup
          foreignAlias: Users

sfGuardUserProfile:
  actAs:
    Timestampable: ~
  columns:
    user_id:
      type: integer
      notnull: true
    email:
      type: string(80)
      notnull: true
      unique: true
    email_new:
      type: string(80)
      unique: true
    firstname:
      type: string(30)
    lastname:
      type: string(70)
    org_name:
      type: string(80)
      notnull: true

  relations:
    User:
      class: sfGuardUser
      foreign: id
      local: user_id
      type: one
      onDelete: cascade
      foreignType: one
      foreignAlias: Profile




sfGuardGroup:
  actAs: [Timestampable]
  columns:
    name:
      type: string(255)
      unique: true
    description: string(1000)
  relations:
    Users:
      class: sfGuardUser
      refClass: sfGuardUserGroup
      local: group_id
      foreign: user_id
      foreignAlias: Groups


Edit2: Я разместил свои новые проблемы, которые я описал в первом редактировании, как отдельный вопрос здесь !

Ответы [ 2 ]

1 голос
/ 14 декабря 2010

Полагаю, если ваш запрос возвращает объект Doctrine_Collection, вы можете использовать его с пейджером, не так ли?

0 голосов
/ 14 декабря 2010

Да, что сказал greg0ire. Эта документация немного устарела , но она показывает, что вам нужно с Propel в старые времена.Обновление Доктрины было бы похоже на

public function executeList ()
{
  $pager = new sfDoctrinePager('Comment', 2);

  $q = Doctrine_Core::getTable('Comment')
    ->createQuery('c')
    ->where('c.author = ?', 'Steve')
    ->leftJoin('c.Article a')
    ->andWhere('a.content LIKE ?', '%enjoy%')
    ->orderBy('c.created_at ASC');

  $pager->setQuery($q);
  $pager->setPage($request->getParameter('page', 1));
  $pager->init();

  $this->pager = $pager;
}

Этот пост в блоге "Учебный пейджер Symfony для двух таблиц" имеет более расширенный / запутанный пример.О, похоже, это был ответ автора на его собственный вопрос .

...