Search code examples
phpzend-framework2tablegateway

TableGateway with multiple FROM tables


I would like to do a simple INNER JOIN between two tables in Zend2.

Concretely, I would like to do this in Zend2:

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

I have a 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');
    });
  }
}

The $select->from('foo'); returns an error:

==> Since this object was created with a table and/or schema in the constructor, it is read only.

So, I can't tweak my FROM statement to match a simple inner join between FooTable and BarTable.


Solution

  • I hope this will help you along your journey as this is a working example I have:

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