【发布时间】:2011-06-08 23:31:29
【问题描述】:
假设表 TA 中的每条记录都指向表 TB 中的一条记录,而该记录又指向表 TC 中的一条记录。如果我要编写一个 select 语句来从表 TA 中检索一些结果,并且想要包含一个使用在来自表 TC 的记录上定义的远程属性的条件,那么我必须编写一堆连接语句并记住名称将这些表链接在一起的主键和外键。嗯,这很容易做到,但是也很无聊,尤其是当你编写类似的连接来解决不同查询中的类似问题时......
使用对象表示法来访问子记录/属性会更容易,或者像这样:
"TA.TB.TC.attribute"
我什至更喜欢使用路径表示法:
"TA/TB/TC/attribute"
当然,为了让类似的东西正常工作,应该有一种方法可以在某处或类似的地方预先定义表的关系(伪代码):
table TA(
has one TB as "B"
on (TA.fkey = TB.pkey)
)
table TB(
has one TC as "C"
on (TB.fkey = TC.pkey)
)
所以我们可以这样写一个选择指令:
select * from TA where B/C/attribute = "something"
这会被解释器转换成:
select * from TA
join TB as B on (TA.fkey = TB.pkey)
join TC as C on (TB.fkey = TC.pkey)
where C.attribute = "something"
此外,甚至还有一种方法可以为我在这里所说的“远程属性”创建“快捷方式”。示例:
table TA(
has one TB as "B"
on (TA.fkey = TB.pkey);
)
# define a "shortcut"
TA.C_attribute = TA/B/C/attribute;
然后 C_attribute 将作为 TA 的列存在,但只是虚拟的而不是实际的;尽管如此,它会在查询中变得可见和可访问:
select * from TA where C_attribute = "something"
这将强制解析器/解释器检查用户预定义的所有规范,然后使用所有这些连接正确地重写 SQL。
那么,有没有在 PHP 中执行此操作的工具/框架?我不是指教义——它没有涵盖我在这里经历的所有这些要求。
【问题讨论】:
-
像 Doctrine 这样的 ORM 缺少哪些功能?据我所见,它可以满足您的所有要求。
-
那么您能否将我链接到他们解释您将如何执行诸如定义“远程属性的快捷方式”之类的部分?这就是我所需要的。谢谢。
标签: php sql frameworks join