【发布时间】:2011-10-28 20:45:31
【问题描述】:
我需要一个 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 可以做到这一点?
谢谢 啊哈
【问题讨论】:
-
教义有什么问题?您可以使用“eager fetching”将实体配置为使用连接执行单个查询。见doctrine-project.org/docs/orm/2.0/en/reference/…。此外,
Zend_Db_Table不是 ORM。充其量,它是 table-data-gateway 模式的实现 -
谢谢菲尔。 Doctorine 对于小项目来说很重!你能给我样品作为我的例子吗?如何使用(出)DQL?
-
我不知道“小项目重”是什么意思。它是一个工具,你使用它。如果您想在项目中使用 ORM,Doctrine 将是我的首选。另请参阅Eager Loading。您基本上将
fetch="EAGER"添加到您的关联映射中。另外,它是Doctrine,而不是Doctorine。
标签: php zend-framework orm relationships