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' です。本当にやりたいことは、結合された両方のテーブルから列を取得することだけです。OO ファルデラルをすべて使用せずにストレートな SQL ステートメントを作成する zf2 の方法があると思うので、そのように強制することができます。しかし、私はできる限り枠組みの中で働きたいと思っています。

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 に答える
1

私はそれを考え出した。

これを追加しました:

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

そして、これは終わり近くにあります:

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

これは期待される結果を返しますが、行がオブジェクトではなく連想配列として返されるという警告があります。

于 2013-05-22T20:06:39.723 に答える