Есть несколько способов, которыми Gacela может обрабатывать автоматическую выборку связанной информации:
1) Отношения наследования
В примере, подобном следующему:
CREATE TABLE wizards (
wizardId INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
fname VARCHAR(255) NOT NULL,
lname VARCHAR(255) NOT NULL,
ROLE ENUM('teacher', 'student') NULL,
addressId INT UNSIGNED NULL,
CONSTRAINT fk_address_wizard
FOREIGN KEY (addressId)
REFERENCES addresses(addressId)
ON DELETE SET NULL
) ENGINE = Innodb;
CREATE TABLE students (
wizardId INT UNSIGNED NOT NULL PRIMARY KEY,
houseId INT UNSIGNED NOT NULL,
isDAMembmer BOOL NOT NULL DEFAULT 0,
CONSTRAINT fk_wizard_student
FOREIGN KEY (wizardId)
REFERENCES wizards(wizardId)
ON DELETE CASCADE,
CONSTRAINT fk_house_students
FOREIGN KEY (houseId)
REFERENCES houses(houseId)
ON DELETE RESTRICT
) ENGINE = Innodb;
Таблица students
имеет тот же первичный ключ, что и таблица wizards
, и благодаря определению взаимосвязи внешнего ключа Gacela обнаружит, что students
наследует все поля от wizards
.
2) Зависимые отношения
Это, вероятно, ближе к тому, что вы ищете:
CREATE TABLE addresses (
addressId INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
locationName VARCHAR(255) NOT NULL
) ENGINE = Innodb;
CREATE TABLE wizards (
wizardId INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
fname VARCHAR(255) NOT NULL,
lname VARCHAR(255) NOT NULL,
ROLE ENUM('teacher', 'student') NULL,
addressId INT UNSIGNED NULL,
CONSTRAINT fk_address_wizard
FOREIGN KEY (addressId)
REFERENCES addresses(addressId)
ON DELETE SET NULL
) ENGINE = Innodb;
Однако этот пример все еще немного отличается от вашего примера, поскольку addressId находится в wizards
таблица, таким образом, создавая отношение ownTo, а не hasMany, что отражает ваш пример.
Существует третий вариант, доступный в Gacela, однако я хотел бы сначала предположить, что вы считаете, что, хотя зачастую предпочтительнее получать данные с нетерпением, существуют реальные последствия для производительности при всегда извлеченной загрузке, а не при отложенной загрузке данных.Именно по этой причине Gacela (и в основном любой другой Data Mapper или ORM) по умолчанию не с готовностью извлекает данные из отношений hasMany.Тем не менее, вы можете написать что-то вроде следующего:
class Mapper extends \Gacela\Mapper
{
public function find($id)
{
$query = $this->_source()->query();
$query->from('persons', array('fullName'))
->join('phones', 'phones.person=persons.id', array('phonenumber'), 'left')
->where('persons.id = :id', array(':id' => $id);
$data = $this->_source->query($query);
return $this->_load($data);
}
}