ГДЕ В SQL запрос с использованием Zend_Db - PullRequest
0 голосов
/ 29 февраля 2012

Zend Framework начинающий здесь.Я пытаюсь получить все названия Xbox базы данных видеоигр.Одна таблица содержит игры.Другая таблица содержит типы игр (например, Xbox, Xbox Live Arcade, ...).Обычно я использую следующий запрос для получения заголовков Xbox.

Как выполнить тот же запрос, используя Zend_Db?

Спасибо,

SELECT titleGame
FROM Game 
WHERE idGameType IN (
    SELECT idGameType 
    FROM GameType 
    WHERE nameGameType = 'Xbox')

Ответы [ 2 ]

6 голосов
/ 29 февраля 2012

Это можно переписать в Zend Framework несколькими способами.Вот как я обычно пишу выборки, например, используя Zend_Db_Table_Select .

<?php

// For brevity, $dbTable = a Zend_Db_Table object

// first construct the subquery/join for the IN clause
// SELECT idGameType FROM GameType HERE nameGameType = 'Xbox'
$subselect = $dbTable->select()
                     ->from('GameType', array('idGameType'))
                     ->where('nameGameType = ?', 'Xbox'); // quotes Xbox appropriately, prevents SQL injection and errors

// construct the primary select
// SELECT titleGame FROM Game WHERE idGameType IN (subquery)
$select = $dbTable->select()
                  ->setIntegrityCheck(false) // allows us to select from another table
                  ->from($dbTable, array('titleGame'))
                  ->where('idGameType IN (?)', $subselect);

$results = $select->query()->fetchAll(); // will throw an exception if the query fails
if(0 === count($results)) {
    echo "No Results";
}else{
    foreach($results as $result){
        echo $result['titleGame'] . '<br />';
    }
}

Вы также можете написать SQL в виде строки, но, когда это возможно, объектно-ориентированный подход идеален, потому чтоэто делает запросы более переносимыми, а самое главное упрощает их защиту.

Пример:

$db = Zend_Db_Table::getDefaultAdapter();  // get the default Db connection
$db->select("select * from table where id = 3"); // doable, but not recommended

Вы также можете создать подготовленный оператор черезZend_Db_Statement в PHP PDO расширение.

$sql = 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?';
$stmt = new Zend_Db_Statement_Mysqli($db, $sql);
$stmt->execute(array('goofy', 'FIXED'));

Первый подход, объектно-ориентированный свободный интерфейс - это то, что вы увидите больше всего, и метод, который я бы рекомендовал начать с ииспользуя.

Ознакомьтесь с страницами справочника Zend_Db и, в частности, Zend_Db_Table_Select, Zend_Db_Table и Zend_Db_Adapter для получения дополнительной информации.Даже быстрое чтение по ZF Quickstart , уделяющее особое внимание части Db, полезно.Он покажет, как настроить классы таблиц в качестве шлюза между вашим приложением и базой данных.

0 голосов
/ 01 марта 2012
SELECT titleGame FROM Game
LEFT JOIN GameType ON GameType.idGameType = Game.idGameType
WHERE GameType.nameGameType = 'Xbox'

Почему бы вместо этого не использовать соединение?Исходя из моего опыта, в MySQL субселект внутри IN очень медленный.

$select = $db->select();
$select->from('Game', array('titleGame'));
$select->joinLeft('GameType', 'GameType.idGameType = Game.idGameType', array());
$select->where("GameType.nameGameType = 'Xbox'");
...