Работа со связанными объектами
Последнее обновление Apr 4th, 2020 | История страницы | Улучшить эту страницу | Сообщить о проблеме
Support the team building MODX with a monthly donation.
The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.
Backers
Budget
$301 per month—let's make that $500!
Learn moreДоступ к связанным объектам в xPDO можно получить через newQuery
, как показано ранее, или через вспомогательные функции xPDOObject
, getOne и getMany (в зависимости от отношений).
Получение объектов¶
Прежде всего, давайте посмотрим на методы поиска связанных объектов:
getOne¶
Допустим, у нас есть объект Car, который имеет объект, связанный с владельцем. Каждый автомобиль может иметь только одного владельца, который представляет собой таблицу с идентификатором, именем и адресом электронной почты. Мы хотим захватить владельца, учитывая, что у нас есть объект Car:
$car = $xpdo->getObject('Car',123);
$owner = $car->getOne('Owner');
echo 'The owner of this car is: '.$owner->get('name');
getOne также принимает $criteria
и параметр $cacheFlag
, аналогично getObject
и getCollection
. Это позволяет вам сделать немного больше фильтрации, если вы того пожелаете.
getMany¶
Теперь скажите, что у нас есть объекты Wheel для нашего автомобиля - очевидно, может быть более одного Wheel на Машину, и мы хотим собрать всю их коллекцию. У объекта Wheel есть поля 'id' и 'position':
$car = $xpdo->getObject('Car',123);
$wheels = $car->getMany('Wheel');
foreach ($wheels as $wheel) {
echo 'Got the '.$wheel->get('position').' wheel!<br />';
}
/* This would echo:
Got the Front Left wheel!
Got the Front Right wheel!
Got the Back Left wheel!
Got the Back Right wheel! */
Как видите, это позволяет нам легко и быстро захватывать связанные объекты.
Добавление связанных объектов¶
В xPDO также есть методы для добавления связанных объектов в существующий объект, чтобы упростить сохранение:
addOne¶
Итак, у нас есть объект Car, но, скажем, мы хотим назначить ему нового владельца, которого мы только что создали. Мы можем использоватьaddOne легко добавить его в:
$car = $xpdo->getObject('Car',123);
$owner = $xpdo->getObject('Owner',array('name' => 'Mark'));
$car->addOne($owner);
$car->save();
При сохранении объекта Car в поле owner
в строке «Car» будет указан идентификатор владельца через определение отношения.
Вы также можете сделать это с новыми (несохраненными) объектами save - функция будет каскадна и сохранить оба объекта. Допустим, у нас есть объект Car, но мы добавляем совершенно нового владельца:
$car = $xpdo->getObject('Car',324);
$owner = $xpdo->newObject('Owner');
$owner->set('name','John');
$owner->set('email','[email protected]');
$car->addOne($owner);
$car->save();
Это сохранит объект Car и Owner и свяжет их вместе.
И то и другое addOne и addMany принимают второй параметр, называемый alias
. Это следует использовать, когда объект имеет более одного отношения с одним классом. Например, добавив отношения Владелец и Продавец, которые оба являются объектами пользователя:
$car->addOne($ownerUser,'Owner');
$car->addOne($sellerUser,'Seller');
Это помогает xPDO различать, какой объект принадлежит к какому отношению.
addMany¶
Объекты с отношениями один-ко-многим также могут быть добавлены в пакетном режиме через addMany метод. Допустим, мы хотим добавить все объекты Wheel шириной 10 в нашу машину:
$wheels = $xpdo->getCollection('Wheel',array(
'width' => 10,
));
$car->addMany($wheels);
$car->save();
Это добавит все колеса шириной 10 и сохранит отношения.
Смотрите также¶
Support the team building MODX with a monthly donation.
The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.
Backers
Budget
$301 per month—let's make that $500!
Learn more