我觉得我一定错过了一些非常简单的事情。这是一个非常简单的任务,我想做的就是得到类似的东西:
SELECT * FROM lookup_items
JOIN lookup ON lookup_items.lookup_id = lookup.id
这会以常规 SQL 形式返回所有连接表的所有列。这是我在 zf2 中的尝试:
$select = new Select();
$select->from('lookup_items');
$select->join('lookup', 'lookup_items.lookup_id = lookup.id');
结果集仅包含“lookup_items”中的列。我尝试了各种方法来获取“查找”列,包括:
$select->columns(array('lookup_items.*', 'lookup.*'));
但它们都爆炸了。当然有一种方法可以做到这一点,而且它是如此简单,我完全错过了它。
我认为一个简单的例子可以避免混淆,但这里有更多代码:
class LookupItemsTable extends AbstractTableGateway
{
public function getList($resource)
{
$system_name = str_replace('*', '%', strtoupper($resource));
$joinTable = 'lookup';
$select = new Select();
$select->from($this->table);
$select->join($joinTable, "{$this->table}.lookup_id = {$joinTable}.id");
$where = array();
$where[] = "{$this->table}.enabled is true";
$where[] = "{$joinTable}.enabled is true";
$where[] = "UPPER({$joinTable}.system_name) ilike '{$system_name}'";
$select->where($where);
$sort[] = 'sort_order ASC';
$sort[] = 'value ASC';
$select->order($sort);
$rowset = $this->selectWith($select);
return $rowset;
}
}
地点:
$resource = $this->params()->fromRoute('resource', 'BUSINESS');
$this->table 是“lookup_items”。实际上,我想做的就是从两个连接表中获取列。我想有一种 zf2 方法可以直接生成 SQL 语句,而无需所有 OO falderal,所以我可以强制这样做。但我宁愿尽可能在框架内工作。
只需更改此行
$select->join('lookup', 'lookup_items.lookup_id = lookup.id');
到
$select->join('lookup', 'lookup_items.lookup_id = lookup.id', array('lookupcol1', 'lookupcol2');
Raj 答案是最好的答案,但只有当您不忘记在 LookupItems 模型中添加这些字段时它才有效。
class LookupItems
{
// Your lookup_items fields here...
...
// And the added lookup fields here, the ones you add in the array
public $lookupcol1;
public $lookupcol2;
在交换数组方法中:
public function exchangeArray($data)
{
// .... your fields, and the new ones
$this->lookupcol1 = (! empty($data['lookupcol1'])) ? $data['lookupcol1'] : null;
$this->lookupcol2 = (! empty($data['lookupcol2'])) ? $data['lookupcol2'] : null;
}
我明白了。
添加了这个:
$select->columns(array('*'));
然后这接近尾声了:
$sql = new Sql($this->adapter);
$statement = $sql->prepareStatementForSqlObject($select);
$rowset = $statement->execute();
这将返回预期的结果,但需要注意的是,现在我的行作为关联数组而不是对象返回。
这是您在 zf2 中使用 join 创建查询的方法。
$resultSet = $this->select(function (Select $select) {
// omit the table name
//$select->from('foo');
$select->join('users', "users.id foo.createdby", 'firstname', '');
$select->order('id ASC');
// echo $select->getSqlString();// to print your query
});
$entities = array();
foreach ($resultSet as $row) {
$entity = new Entity\Foo();
$entity->setId($row->id)
->setFullname($row->fullname)
->setCaseid($row->caseid)
->setTestimonial($row->testimonial)
->setSortorder($row->sortorder)
->setActive($row->active)
->setCreated($row->created)
->setModified($row->modified)
->setFirstname($row->firstname)
->setCreatedby($row->createdby);
$entities[] = $entity;
}
return $entities;