Jump to main content Jump to doc navigation

Доступ к связанным объектам в 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

  • modmore
  • STERC
  • Digital Penguin
  • Jens Wittmann – Gestaltung & Entwicklung
  • Fabian Christen
  • Dannevang Digital
  • Sepia River Studios
  • CrewMark
  • Chris Fickling
  • deJaya
  • eydolan
  • Lefthandmedia
  • Murray Wood
  • Following Sea
  • Anton Tarasov
  • Stéphane Jäggi
  • Raffy
  • Snow Creative
  • A. Moreno
  • Nick Clark
  • JT Skaggs
  • Helen
  • YJ
  • krisznet
  • Richard
  • Yanni

Budget

$306 per month—let's make that $500!

Learn more