使用tableGateway返回表主键名

时间:2012-11-30 13:35:59

标签: zend-framework2

我正在尝试为Table Objects创建一个抽象对象。

今天我有许多对象:CategoriaTableFornecedoresTable等实现$this->tableGateway->insert()$this->tableGateway->update()

我创建了一个包含大部分功能的TableAbstract,但我坚持一个问题:

// In CategoriaTable my table id is named cat_id
$this->tableGateway->update($object->getArrayCopy(),array('cat_id' => $object->getId()))

// But in FornecedoresTable my table id is named for_id
$this->tableGateway->update($object->getArrayCopy(),array('for_id' => $object->getId()))

如何从tableGateway获取表的id?有更好的方法来做我想要的事情吗?

我想我可以在我的对象中注入id名称,但我不认为这是一个很好的方法...

1 个答案:

答案 0 :(得分:3)

您可以创建新的TableGateway类参数。(在我的情况下,我创建了$ this-> primary;)

如果没有设置,请使用Zend \ Db \ Metadata \ Metadata直接从db结构中找到它。

<?php
//...
use Zend\Db\TableGateway\AbstractTableGateway;
use Zend\Db\Metadata\Metadata;

class AbstractTable extends AbstractTableGateway
{
    protected $primary;

    public function getPrimary()
    {
        if (null === $this->primary) {
            $metadata = new Metadata($this->adapter);
            $constraints = $metadata->getTable($this->getTable()->getTable())
                                    ->getConstraints();

            foreach ($constraints AS $constraint) {
                if ($constraint->isPrimaryKey()) {
                    $primaryColumns = $constraint->getColumns();
                    $this->primary = $primaryColumns;
                }
            }
        }

        return $this->primary;
    }
}
?>