编程语言
首页 > 编程语言> > PHP ORM和优化的关系查询

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