0

テーブルがあるとします:

$someTable = new Zend_Db_Table ('sometable');

テーブルのリテラル名を使用してクエリを作成できることはわかっています。

$sel = $someTable -> select () 
                  -> from ('sometable', array ('col_foo', 'col_bar')) 
                  -> where ('some_condition')

テーブルに別名を付けることができます。

$sel = $someTable -> select () 
                  -> from (array ('alias' => 'sometable'), array ('col_foo', 'col_bar')) 
                  -> where ('some_condition')

また、from() 呼び出しで Zend_Db_Table を直接使用できることもわかっています。

$sel = $someTable -> select () 
                  -> from ($someTable, array ('col_foo', 'col_bar')) 
                  -> where ('some_condition')

しかし、以下のようにテーブル オブジェクトをエイリアスしようとすると、致命的なエラーが発生します。

$sel = $someTable -> select () 
                  -> from (array ('alias' => $someTable), array ('col_foo', 'col_bar')) 
                  -> where ('some_condition')

キャッチ可能な致命的なエラー: クラス Zend_Db_Table のオブジェクトを文字列に変換できませんでした ...

from()、join() などのメソッドは Zend_Db_Table オブジェクトを渡すことはできますが、エイリアスを作成したい場合は処理できないため、これはバグのある動作のように思えます。

上記の例は、問題を説明するために少し工夫して単純化したものです。実際のコードはテーブル間の結合を行っていますが、テーブル オブジェクトが渡されるため、それらの名前が前もってわかりません。もちろん、テーブル名を取得して文字列として挿入するために info() を使用して上記の問題を回避することはできますが、これは余分なコードを意味し、私には面倒に見えます。さらに、これは Zend_Db がそのような回避策なしで対処できる状況です。

Zend Framework 1.7.6 を使用しています。Zend_Db_Table_Abstract をサブクラス化して、テーブル オブジェクトを作成しています。残念ながら、アップグレードされたバージョンの Zend をインストールする権限がありません。

4

1 に答える 1

2

ZF のアップグレードされたバージョンは役に立ちませんが、ZF と PHP の現在のバージョンのセキュリティ アングルについて議論する必要があります (試して損はありません ;) ):

$sel = $someTable -> select () 
                  -> from (array ('alias' => $someTable), array ('col_foo', 'col_bar')) 
                  -> where ('some_condition')

alias はオブジェクトで$someTableはなく文字列になりたがっており、現在はオブジェクトです。私はあなたがしたいことを$someTable->getConfig()->name;するべきだと思います。

Zend_Db_Table_Abstractからの抜粋from():

/**
 * Adds a FROM table and optional columns to the query.
 *
 * The first parameter $name can be a simple string, in which case the
 * correlation name is generated automatically.  If you want to specify
 * the correlation name, the first parameter must be an associative
 * array in which the key is the correlation name, and the value is
 * the physical table name.  For example, array('alias' => 'table').
 * The correlation name is prepended to all columns fetched for this
 * table.
 */

最初のパラメーターは のインスタンスにすることもできますがZend_Db_Select()、オブジェクトを配列と混在させることはできません。

これを考えてみてください。任意のテーブル名に対して Zend_Db_Table のインスタンスを作成できる単純なエンティティ クラスを作成できます。

class Application_Model_DbTable extends Zend_Db_Table_Abstract
{
    protected $_name;
    protected $_primary;

    public function __construct($name, $primary = 'id') {
        $this->_name = $name;
        $this->_primary = 'something_other_then_id';

    }

    //implement __set and __get if you want

}

これにより、テーブル名とそのテーブルのプライマリ ID を渡すだけで済みます。Zend_Db_Table API 全体と、設計したカスタム メソッドを自由に使用できます。

幸運を。

于 2012-11-14T11:06:55.163 に答える