0
$table = new Zend_Db_Table(array('name'=>'rules'));

    $select = $table->select();
    $select->setTable($table); 
    $select->setIntegrityCheck(false);

    $select = $select
    ->from(array('ru'=>'rules'),array('ru.*'))
    ->join(array('ro'=>'roles'),'ro.id=ru.role_id',array('role_id'=>'ro.id'))
    ->join(array('g'=>'groups'),'ro.group_id=g.id',array('group_id'=>'g.id'))
    ->join(array('ug'=>'user_groups'),"ug.group_id=g.id",array('user_group_id'=>'ug.id'))
    ->where("ug.user_id={$userId}")
    ->where("ru.resource='{$resource}'")
    ->where("ru.privilege='{$privilege}'");
    echo "select: ".$select->__toString();

$row = $table->fetchAll();

上記のコードがありますが、fetchAll()を実行すると、where句を無視してテーブル内のすべての行が返され、fetchRow()を使用すると、最初に見つかった行が返され、where句が無視されてSQLステートメントが出力されます。個別に実行すると、手がかりが正しく実行されますか?

4

3 に答える 3

2

これは、dbselectオブジェクトを正しく作成する方法です。

$db = Zend_Db::factory( ...options... );
$select = new Zend_Db_Select($db);

または、データベースアダプタのselect()メソッドを使用します

$db = Zend_Db::factory( ...options... );
$select = $db->select();

そして、あなたは条項を追加することができます

  // Build this query:
  //   SELECT *
  //   FROM "table1"
  //   JOIN "table2"
  //   ON "table1".column1 = "table2".column1
  //   WHERE column2 = 'foo'

  $select = $db->select()
               ->from('table1')
               ->joinUsing('table2', 'column1')
               ->where('column2 = ?', 'foo');

詳細については、Zend_Dbリファレンスガイドをご覧ください。

于 2011-04-28T13:19:20.007 に答える
0

これは機能するはずです。ちょうどそれをテストしました。

    $table = new Zend_Db_Table('rules');
    $select = $table->getAdapter()->select();

    $select->from(array('ru' => 'rules'), array('ru.*'))
           ->join(array('ro'=>'roles'), 'ro.id = ru.role_id', array('role_id'=>'ro.id'))
           ->join(array('g'=>'groups'), 'ro.group_id = g.id', array('group_id'=>'g.id'))
           ->join(array('ug'=>'user_groups'),"ug.group_id=g.id",array('user_group_id'=>'ug.id'))
           ->where('ug.user_id = ?', $userId)
           ->where('ru.resource = ?', $resource)
           ->where("ru.privilege = ?", $privilege);

    echo (string)$select;
于 2011-04-29T13:01:01.133 に答える
0

@ArtWorkADはある意味で正しいです。ただし、あなたの場合は、Zend_Db_Selectを使用しているだけではありません。Zend_Db_Tableから取得したZend_Db_Selectを拡張しようとしました(Zend_Db_Tableでシングルトンパターンを処理する必要がありますが、これは別の問題です)。あなたの現在の問題(あなたが確かにドキュメントをあまりにも速く読んでいるという事実を除いて)は、この行が正しかったということです:

 $select->setIntegrityCheck(false);

これにより、「select-from-a-zend-db-table」がアクティブレコードモードに制限されなくなり、追加の結合に使用できるようになります。

しかし、その直後にあなたは以下を作ります:

$select = new Zend_Db_Select($table);

これは、変数に入れる新しいオブジェクトの完全な作成です。以前の変数値から何も保持されません。$select=null;同じになる直前に追加することができます。つまり、これは前の3行をキャンセルするだけです。

まったく同じ混乱モードでは、この行は次のとおりです。

$select->setTable($table); 

すでにZend_Db_Tableから選択を取得しているため、テーブルはすでに存在しているため、必要ありません。

編集 そしてあなたの最後のそしてより大きなエラーは:

$table->fetchAll()

ビルドではなく、を使用する$selectため$table、$selectで実行されたすべてが事実上無視されます:-)。shoudlからの$selectFecthingはあなたにより良い結果を与えます

于 2011-04-30T22:22:32.913 に答える