PHP ORM和优化的关系查询
作者:互联网
我需要一个PHP ORM才能很好地处理关系.
请考虑以下Zend中的代码:
$persons = new Persons();
$person = $persons->find(5)->current();
echo 'Name: '.$person->fullname;
$phones = $person->findDependentRowset('Phones');
foreach($phones as $phone)
echo 'Phone: '.$phone->phonenumber;
或以下xPDO中的代码:
$person = $xpdo->getObject('Persons', 5);
echo 'Name: '.$person->get('fullname');
$phones = $person->getMany('Phones');
foreach($phones as $phone)
echo 'Phone: '.$phone->get('phonenumber');
在这两个脚本中,ORM均执行以下两个查询:
SELECT * FROM persons WHERE id=5;
SELECT * FROM phones WHERE person=5;
这意味着对主对象进行一次查询,对每个关系进行一次查询,但是我需要对主对象及其关系使用一个查询!
xPDO可以按以下方式进行操作:
$person = $xpdo->getObjectGraph('Persons', '{"Phones":{}}', 5);
echo 'Name: '.$person->get('fullname');
foreach($person->Phones as $phone)
echo 'Phone: '.$phone->get('phonenumber');
执行以下查询:
SELECT * FROM persons
LEFT JOIN phones ON phones.person=persons.id
WHERE persons.id=5
这很棒,但是无法设置要从表中获取的字段!
这意味着在这种情况下,xPDO使用“ SELECT *”,因此如果我得到一个对象及其4个关系,我将获得所有这些表的所有字段!
所以我需要一个ORM来执行下面的示例查询,例如:
SELECT persons.fullname , phones.phonenumber FROM persons
LEFT JOIN phones ON phones.person=persons.id
WHERE persons.id=5
Doctrine可以通过DQL做到这一点,但我认为Doctrine对个人项目不利.有没有PHP ORM可以做到这一点?
谢谢
AHHP
解决方法:
xPDO可以做到.您只需要调整您的想法和要求即可.
请记住,objectGraph使用对象的类名,在图和查询中使用图中的关系.
$criteria = $this->xpdo->newQuery('prefixClient');
if (!empty($limit))
$criteria->limit($limit);
$criteria->where(array('Child.planid' => $this->getPrimaryKey(),
'Child.active' => true,
'GrandChild.someAttribute' => true,
'GreatGrandChild.someOtherAttribute' => true,
'suspended' => false
));
$out = $this->xpdo->getCollectionGraph('prefixClient', '{"Child":{"GrandChild":{"GreatGrandChild":{}}}}', $criteria);
您可以在关系的任何方面设置WHERE,包括当前对象,如悬浮=>中所示.错误的行.
我的书可能会帮助您建立模式和关系.对象的名称应始终为单数,而它们的关系可以为复数(1:M)或单数(1:1).
标签:orm,relationships,zend-framework,php 来源: https://codeday.me/bug/20191102/1988505.html