假设表TA中的每条记录都指向表TB中的一条记录,而这个记录又恰好指向表TC中的一条记录。如果我要编写一个select语句来从表TA中检索一些结果,并且想要包含一个使用来自表TC的记录上定义的远程属性的条件,那么我必须编写一堆连接语句,并记住名称将这些表链接在一起的主键和外键。嗯,这很容易做到,但是它也很无聊,尤其是当你编写类似的连接来解决不同查询中的类似问题时...避免在SQL/Select语句中写入重复联接的框架?
使用对象表示法访问子对象会容易得多记录/属性,或者是这样的:
"TA.TB.TC.attribute"
我甚至preffer使用路径表示法:
"TA/TB/TC/attribute"
当然,对于这样的事情能够正常工作应该有预先的一种方式 - 定义表格的关系,某处或某事l IKE这(伪代码):
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"
,这将通过解释来coverted到:
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的柱,但只有几乎不fisically;但是它会在查询变得可见和可访问:
select * from TA where C_attribute = "something"
这会迫使分析器/解释器正确去通过用户预先定义的所有规格,然后重写SQL与所有这些连接。
那么,有没有一个工具/框架,在PHP中呢?我不是指教义 - 它不包括我在这里经历的所有这些要求。
从Doctrine等ORM中缺少哪些功能?从我所看到的,它可以满足你在这里要求的一切。 – notJim 2011-06-08 23:36:00
那你能否把我连接到他们解释如何做定义“远程属性快捷方式”之类的部分?这就是我需要的。谢谢。 – fabio 2011-06-09 00:06:05