hashCode()
массивов использует реализацию по умолчанию, которая не учитывает элементы, и вы не можете изменить это.
Вместо этого вы можете использовать List
, используя hashCode()
, рассчитанный на основе хэш-кодов его элементов. ArrayList
(как и большинство реализаций) использует такую функцию.
Альтернативно (но менее предпочтительно, если вы не вынуждены каким-то образом использовать массивы), вы можете использовать «специальный» HashSet
, где вместо этого вызова key.hashCode()
вызывают Arrays.hashCode(array)
. Чтобы реализовать это расширение HashMap
, а затем используйте Collections.newSetFromMap(map)
$q = Doctrine_Manager::getInstance()->getCurrentConnection();
$result = $q->execute(" -- RAW SQL HERE -- ");
См. документацию Doctrine API для различных методов выполнения.
Да. Вы можете получить хэндл базы данных из 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 не будет автоматически гидрировать ваши результаты в объекты записей и т.д., поэтому вам придется иметь дело с результатами, возвращаемыми в виде массива, состоящего из одного массива на каждую возвращаемую строку (ключ-значение как столбец-значение).
Я не уверен, что вы имеете в виду, говоря необработанный 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);
}
}
Вы также можете использовать Doctrine_RawSql (); для создания необработанных SQL-запросов, которые будут преобразованы в объекты доктрины.