Select игнорирует предложение where с помощью Zend_Db_Select - PullRequest
0 голосов
/ 28 апреля 2011
$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 и запустить его отдельно, и он выполняется правильно какая-нибудь подсказка?

Ответы [ 3 ]

2 голосов
/ 28 апреля 2011

Так вы бы правильно создали объект выбора БД

$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

0 голосов
/ 01 мая 2011

@ ArtWorkAD прав в определенном смысле.Но в вашем случае вы не просто используете Zend_Db_Select.Вы пытались расширить Zend_Db_Select, полученный из Zend_Db_Table (ну, вы должны попытаться обработать шаблон Singleton с помощью 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, игнорируется :-).Fecthing от $select shoudl даст вам лучшие результаты

0 голосов
/ 29 апреля 2011

Это должно работать.Только что проверил.

    $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;
...