2013-01-16 10 views
5

Ich möchte eine einfache INNER JOIN zwischen zwei Tabellen in Zend2 tun.TableGateway mit mehreren FROM Tabellen

Konkret würde Ich mag diese in Zend2 tun:

SELECT * FROM foo, bar WHERE foo.foreign_id = bar.id;

Ich habe ein FooTable:

class FooTable 
{ 
    protected $tableGateway; 

    public function __construct(TableGateway $tableGateway) 
    { 
    $this->tableGateway = $tableGateway; 
    } 

    public function get($id) 
    { 
    $rowset = $this->tableGateway->select(function (Select $select) { 
     $select->from('foo'); 
    }); 
    } 
} 

Die $select->from('foo'); gibt einen Fehler zurück:

==>Da dieses Objekt im Konstruktor mit einer Tabelle und/oder einem Schema erstellt wurde, ist es schreibgeschützt.

Also kann ich meine FROM-Anweisung nicht zwicken, um eine einfache innere Verbindung zwischen FooTable und BarTable zu entsprechen.

Antwort

12

Ich hoffe, das Ihnen auf Ihrer Reise helfen werden, da dies ein funktionierendes Beispiel ist, ich habe:

namespace Pool\Model; 

use Zend\Db\TableGateway\AbstractTableGateway; 
use Zend\Db\Sql\Select; 

class IpaddressPool extends AbstractTableGateway 
{ 
    public function __construct($adapter) 
    { 
     $this->table = 'ipaddress_pool'; 

     $this->adapter = $adapter; 

     $this->initialize(); 
    } 

    public function Leases($poolid) 
    { 
     $result = $this->select(function (Select $select) use ($poolid) { 
      $select 
       ->columns(array(
        'ipaddress', 
        'accountid', 
        'productid', 
        'webaccountid' 
       )) 
       ->join('account', 'account.accountid = ipaddress_pool.accountid', array(
        'firstname', 
        'lastname' 
       )) 
       ->join('product_hosting', 'product_hosting.hostingid = ipaddress_pool.hostingid', array(
        'name' 
       )) 
       ->join('webaccount', 'webaccount.webaccountid = ipaddress_pool.webaccountid', array(
        'domain' 
       ))->where->equalTo('ipaddress_pool.poolid', $poolid); 
     }); 

     return $result->toArray(); 
    } 
} 
+0

Was im obigen Beispiel ist 'use' bedeuten/tun? Ist das eine Lambda-Funktion? Wird 'use' verwendet, um die externe Variable innerhalb der deklarierten Funktion zu verwenden? –

+1

Ich gehe davon aus, dass Sie über den Abschnitt 'use ($ poolid)' sprechen. Da das $ this-> select eine Funktion() aufruft, musste ich auch eine Variable in meiner Abfrage verwenden, indem ich 'use ($ poolid)' hinzufüge, erlaubt diese Fähigkeit. Normale Funktionen 'Funktionsname ($ var1, $ var2)', aber in diesem Fall machen wir einen Funktionsaufruf aus dem Select – Diemuzi

+0

Macht nichts, ich habe die Antwort ... PHP hat sich seit den 4 Jahren, die ich habe, sehr verändert war davon weg. Hier ist ein schöner Beitrag dazu: http://stackoverflow.com/questions/1065188/in-php-5-3-0-what-is-the-function-use-identifier-should-a-sane-programmer-use –