大佬教程收集整理的这篇文章主要介绍了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');
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个关系,我将获得所有这些表的所有字段!
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).
以上是大佬教程为你收集整理的PHP ORM和优化的关系查询全部内容,希望文章能够帮你解决PHP ORM和优化的关系查询所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。