Использование Raw SQL с Doctrine

hashCode() массивов использует реализацию по умолчанию, которая не учитывает элементы, и вы не можете изменить это.

Вместо этого вы можете использовать List, используя hashCode(), рассчитанный на основе хэш-кодов его элементов. ArrayList (как и большинство реализаций) использует такую ​​функцию.


Альтернативно (но менее предпочтительно, если вы не вынуждены каким-то образом использовать массивы), вы можете использовать «специальный» HashSet, где вместо этого вызова key.hashCode() вызывают Arrays.hashCode(array). Чтобы реализовать это расширение HashMap, а затем используйте Collections.newSetFromMap(map)

41
задан Levi Hackwith 5 May 2010 в 16:13
поделиться

4 ответа

$q = Doctrine_Manager::getInstance()->getCurrentConnection();
$result = $q->execute(" -- RAW SQL HERE -- ");

См. документацию Doctrine API для различных методов выполнения.

50
ответ дан 27 November 2019 в 00:18
поделиться

Да. Вы можете получить хэндл базы данных из Doctrine, используя следующий код:

$pdo = Doctrine_Manager::getInstance()->getCurrentConnection()->getDbh();

и затем выполнить SQL следующим образом:

$query = "SELECT * FROM table WHERE param1 = :param1 AND param2 = :param2";
$stmt = $pdo->prepare($query);

$params = array(
  "param1"  => "value1",
  "param2"  => "value2"
);
$stmt->execute($params);

$results = $stmt->fetchAll();  

Вы можете использовать связанные переменные, как в примере выше.

Обратите внимание, что Doctrine не будет автоматически гидрировать ваши результаты в объекты записей и т.д., поэтому вам придется иметь дело с результатами, возвращаемыми в виде массива, состоящего из одного массива на каждую возвращаемую строку (ключ-значение как столбец-значение).

39
ответ дан 27 November 2019 в 00:18
поделиться

Я не уверен, что вы имеете в виду, говоря необработанный SQL , но вы можете выполнять традиционные SQL-запросы следующим образом:

... 
// $this->_displayPortabilityWarning();

$conn = Doctrine_Manager::connection();
$pdo = $conn->execute($sql);
$pdo->setFetchMode(Doctrine_Core::FETCH_ASSOC);
$result = $pdo->fetchAll();
...

Следующий метод не является обязательным, но он показывает хорошую практику.

protected function _displayPortabilityWarning($engine = 'pgsql')
{
     $conn = Doctrine_Manager::connection();
     $driver = $conn->getDriverName();

     if (strtolower($engine) != strtolower($driver)) {
        trigger_error('Here we have possible database portability issue. This code was tested on ' . $engine . ' but you are trying to run it on ' . $driver, E_USER_NOTICE);
     }
}
6
ответ дан 27 November 2019 в 00:18
поделиться

Вы также можете использовать Doctrine_RawSql (); для создания необработанных SQL-запросов, которые будут преобразованы в объекты доктрины.

6
ответ дан 27 November 2019 в 00:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: