2010-12-12 4 views
0

Wie kann ich die Seitennummerierung mit Doctrine_Pager oder sfDoctrinePager implementieren, während meine Abfrage mehrere Spalten aus zwei oder mehr Tabellen auswählt?Wie verwendet man Doktrin oder Symfony Pager mit unterschiedlicher Spalte aus mehreren Tabellen?


Edit1:

Ok, jetzt habe ich herausgefunden, dass es getan werden kann, wie Nathan unten beschrieben hat! Ich war verwirrt, da ich bestimmte Daten aus der Abfrage nicht abrufen konnte! Lassen Sie mich es unten beschreiben:

Das ist mein Pager Abfrage:

 $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(); 

Jetzt in meiner Vorlage kann ich meine sfGuardUser und Profildaten wie folgt abrufen:

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 

} 

ich falsch versuchte rufen Sie die Profildaten von $data->org_name und nicht $data->Profile->org_name ab! Jetzt funktioniert es für dieses Teil richtig, aber es gibt noch ein Problem!

Ich bin nach wie vor nicht in der Lage die Gruppen & LicensedVendors Daten mit $data->Groups->name oder $data->LicensedVendors->status abzurufen! Es zeigt auch keinen Fehler oder irgendeinen Wert an! sieht so aus, als würde eine leere Zeichenfolge ausgegeben. Sollte es nicht den gleichen Wert wie Profildaten bekommen? Aber wenn ich die Abfrage hydrate indem:

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

ich alle Daten durch abrufen können:

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

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

Wie diese Daten zu bekommen, ohne **Doctrine_Core::HYDRATE_SCALAR** Einstellung? Wo ich falsch mache, um diese Gruppen und LicensedVendors Tabellendaten abzurufen? Hier

ist die Schema-Definition der oben beschriebenen Tabellen:

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: ich meine neue Themen geschrieben, die ich in erster bearbeiten als eine separate Frage beschrieben here!

Antwort

0

Ja, was greg0ire sagte. This documentation is a bit old, aber es zeigt, was Sie mit Propel in den alten Tagen brauchen würden.Update auf Lehre wäre wie,

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; 
} 

This blog post, "Symfony doctrine pager for two tables" ein ausgedehntere/gewundenes Beispiel hat. Oh, sieht so aus als wäre die Antwort des Autors auf his own SO question.

+0

Danke Nathan für deine Antwort! Es sollte so funktionieren, wie du es oben angegeben hast; nachdem ich eine Weile versucht habe, habe ich das Problem herausgefunden. Ich muss die Daten tatsächlich auf andere Weise abrufen. Es gibt jedoch noch ein Problem, das ich ausführlich in meinen bearbeiteten Teil der Frage gestellt habe! Du kannst es dir anschauen :) – med

+0

medhad, deine ursprüngliche Frage war klar und ich versuchte es klar zu beantworten. Mit deinen Änderungen ist es eine ganz andere Sache. Vielleicht solltest du eine neue Frage stellen. Ich frage mich, ob Sie die Joins wirklich benötigen, bevor Sie den Pager einrichten? Können Sie '$ license-> getVendorUser()' nicht ausführen, während Sie die Pager-Ergebnisse durchgehen? – Nathan

+0

Nathan, du hast Recht, es als neue Frage zu veröffentlichen! Ich habe es nur in einem neuen Thread gefragt und von hier abgekratzt! Ich kann den Benutzer (Kreditor) durch * $ Lizenz-> getVendorsUser * true, aber in diesem Fall muss ich alle Benutzer, die in der Client-Gruppe sind und ihren entsprechenden Lizenzstatus mit dem aktuellen Anbieter abfragen! – med

1

Ich denke, solange Ihre Abfrage ein Doctrine_Collection-Objekt zurückgibt, können Sie es mit einem Pager verwenden, nicht wahr?

+0

Hi eigentlich hast du recht! Aber ich hatte Probleme beim Abrufen der Daten vom Pager! Ich habe gerade herausgefunden, dass ich, um die Spaltendaten der verbundenen Tabelle zu erhalten, etwas Code anders schreiben muss! – med

Verwandte Themen