RushHourRider
Новичок
Zend_Db_Table - работа со связями
Доброго времени суток.
Дано: MySQL 5.0 MyISAM, PHP5, ZendFramework 1.0, три таблицы (см. ниже)
Вопрос: как без извратов и потерь производительности получить список строк из таблицы Items?
Итак, таблоидцы:
Как видно, Items относится к Types и Owners как M:1. В ZF есть механизм для эмуляции связей. Напишем классцы-модели для всех таблиц:
Благодабря этим конструкциям можем получить для каждой записи из Items связанные с ней записи из Owners и Type:
Все это замечательно, но когда встает задача передать в шаблончег данные для заполнения html-таблички, в воздухе материализовывается госпожа жаба, которая утверждает, что для каждой строки из Items будет сделано еще два запроса к базе для получения связанных данных. Неоптимальненько. Сразу напрашивается новый метод в класс Items:
Но, черт подери, господа! В Zend_Db_Table_Abstract есть замечательный метод fetchAll(), который принимает в качестве параметров и условия для WHERE и для ORDER и т.п. Но его использовать не можем, потому как работает он только с одной таблицей, определенной в $this->_name. В то же время, хочется добавить этот функционал в foo(), но не охота делать ctrl+c ctrl+v из fetchAll(). Дилемма.
Итого. Охота иметь метод для SELECT * FROM Items с подключением связаных таблиц и в стиле Zend_Db_Table::fetch*()
Кто как эту задачу в ZF решает?
Доброго времени суток.
Дано: MySQL 5.0 MyISAM, PHP5, ZendFramework 1.0, три таблицы (см. ниже)
Вопрос: как без извратов и потерь производительности получить список строк из таблицы Items?
Итак, таблоидцы:
Код:
CREATE TABLE Items (
`ID` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
`TypeID` INT NOT NULL,
`OwnerID` INT NOT NULL,
`Identity` VARCHAR(255)
);
CREATE TABLE Types (
`ID` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
`Name` VARCHAR(255)
);
CREATE TABLE Owners (
`ID` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
`Name` VARCHAR(255)
);
PHP:
// foobar.php
include 'Zend/Loader.php';
spl_autoload_register(array('Zend_Loader', 'autoload'));
class Owners extends Zend_Db_Table_Abstract
{
protected $_name = 'Owners';
protected $_primary = array('ID');
protected $_dependentTables = array('Main');
}
class Types extends Zend_Db_Table_Abstract
{
protected $_name = 'Types';
protected $_primary = array('ID');
protected $_dependentTables = array('Items');
}
class Items extends Zend_Db_Table_Abstract
{
protected $_name = 'Items';
protected $_primary = array('ID');
protected $_referenceMap = array(
'Type' => array(
'columns' => 'TypeID',
'refTableClass' => 'Types',
'refColumns' => 'ID',
),
'Owner' => array(
'columns' => 'OwnerID',
'refTableClass' => 'Owners',
'refColumns' => 'ID',
),
);
}
PHP:
$items = new Items();
$item = $items->find(123); // $id = 123;
$item->findParentOwners();
$item->findParentTypes();
PHP:
function foo()
{
$select = $this->_db->select()
->from($this->_name)
->joinLeft('Types', 'Types.ID = Items.TypeID', array('TypeName' => 'Name'))
->joinLeft('Owners', 'Owners.ID = Items.OwnerID', array('OwnerName' => 'Name'));
return $select->query()->fetchAll();
}
Итого. Охота иметь метод для SELECT * FROM Items с подключением связаных таблиц и в стиле Zend_Db_Table::fetch*()
Кто как эту задачу в ZF решает?