7

我觉得我必须错过一些非常简单的东西。这是一个非常简单的任务,我想做的就是得到类似的东西:

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 方法可以在没有所有 OO falderal 的情况下直接创建 SQL 语句,所以我可以强制这样做。但我宁愿尽可能在框架内工作。

4

4 回答 4

7

只需更改此行

$select->join('lookup', 'lookup_items.lookup_id = lookup.id');

$select->join('lookup', 'lookup_items.lookup_id = lookup.id', array('lookupcol1', 'lookupcol2');
于 2013-05-23T04:20:15.507 回答
3

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;

在 exchangeArray 方法中:

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;
}
于 2014-05-13T09:45:01.157 回答
1

我想到了。

添加了这个:

$select->columns(array('*'));

然后这接近尾声:

$sql = new Sql($this->adapter);
$statement = $sql->prepareStatementForSqlObject($select);
$rowset = $statement->execute();

这将返回预期的结果,但需要注意的是,现在我的行​​作为关联数组而不是对象返回。

于 2013-05-22T20:06:39.723 回答
0

这就是在 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;
于 2013-07-30T22:38:58.510 回答