W niektórych sytuacjach pracy z Magento pojawia się konieczność bezpośredniego odwołania się do bazy danych Magento. Operacje takie zawsze muszą być wykonywane z niezwykłą ostrożnością. Należy pamiętać że przykładowo zapisanie produktu czy kategorii w Magento wyzwala szereg zdarzeń w samym systemie, często odwołujących się do wielu tabel. W przypadku, gdy odwołujemy się bezpośrednio przez zapytanie do bazy danych, powyższe zdarzenia nie zajdą.

Korzystanie z bezpośrednich zapytań do bazy danych ma jednak jedną podstawową zaletę - szybkość wykonywania. Tego typu zapytania z reguły wykonywane są krócej niż jedną sekundę, co przy korzystaniu z domyślnych kolekcji Magento może trwać nawet długie sekundy.

 

Aby połączyć się z bazą danych należy najpierw stworzyć model zasobu oraz połączenia odpowiednio do odczytu oraz zapisu danych. Przy korzystaniu z Magento nie trzeba martwić się o zestawienie połączenia z bazą danych. Jedyne co trzeba zrobić to stworzyć instancję zasobu i wybrać odpowiedni rodzaj połączenia.

$resource = Mage::getModel('core/resource');
$read = $resource->getConnection('core_read);
$write = $resource->getConnection('core_write');

 Działanie połączenia do odczytu możemy sprawdzić np. poprzez wykonanie zapytania do bazy:

$query = 'SELECT * FROM catalog_product_entity';
$results = $read->fetchAll($query);

 Przy operowaniu na bazie danych niezwykle przydatna jest metoda getTableName() przyjmująca za parametr nazwę wytwórzą i na tej podstawie odnajdująca odpowiednią tabelę, jednocześnie sprawdzając czy tabela ta istnieje w bazie danych. Aby z niej skorzystać kod powyżej musi zostać odpowiednio przekształcony.

$query = 'SELECT * FROM ' . $resource->getTableName('catalog/product');
$results = $read->fetchAll($query);

 Analogicznie niezwykle proste staje się zapisywanie zmiennych statycznych wywołując wcześniejsze połączenie core_write możemy następnie oznaczyć wszystkie produkty jako niedostępne w magazynie.

$query = 'UPDATE ' . $resource->getTableName('cataloginventory/stock_status') . 'SET `is_in_stock` = 1';
$write = query($query);