doctrine + sfMultiTenant 关于left join的问题

ims2007 2011-12-06 03:24:22
一纠结问题:
环境 数据库映射组件 doctrine ,为了整合 多租客 (对于这种多租客问题,可参看http://msdn.microsoft.com/zh-cn/library/aa479086.aspx) 将多数据库整合为一个,在每个表中,加一个 tenant_id 字段以区别,数据库组件加了一扩展,即加一个监听事件,插入,查找 等操作时都加上一个条件: tenant_id = xx , 这时,问题出现了,在进行leftjoin 查询操作时,select a.*,b.* from m a left join s b on a.id = b.a_id where a.tenant_id = xx and b.tenant_id = xx ;
这样,当 M 表存在的记录,而 S 表不存在时, 这些外联接记录就会查询不到(M表不为空的那些记录,而这些记录是我所需要的), 这是因为监听事件加了 b.tenant_id = xx 这个条件。
有好的解决方法吗?
不要单独的SQL 语句
这是一个大系统中的组件,不应该去更改doctrine(不过兼容也行)
最好是修改插件sfMultiTenantPlugin
    public function preDqlSelect(Doctrine_Event $event) {
$tenant = self::getTenantID();
$q = $event->getQuery();
if (self::isField($event) && $tenant > 0 && $q != null)
$q->addWhere(self::getField($event) . ' = ?', $tenant);
}

...全文
1017 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ims2007 2011-12-15
  • 打赏
  • 举报
回复
这不是MS-SQL Server的问题,它是PHP对象映射框架DOCTRINE,另外,还应用了一个多租户集成组件,这个插件是基于DOCTRINE的插件,其实这个问题的关键不在于SQL,而是对于多租户整合的数据库设计问题。http://msdn.microsoft.com/zh-cn/library/aa479086.aspx
xuzuning 2011-12-15
  • 打赏
  • 举报
回复
这个问题应该到 数据库开发——MS-SQL Server 版面求解
与 php 没什么关系,当然如果是 php 的 sqlserver 不支持的话,虽然与 php 相关,但也只能找微软解决
ims2007 2011-12-15
  • 打赏
  • 举报
回复
可能是我前面问题没有提清楚:
我在做多租户整合中遇到这样一个问题(模拟)

数据库中有两个表: users , depts

这两个表的字段如下:
users: user_id, username, dept_id, tenant_id
depts: dept_id, deptname, tenant_id

表关系为多对多

我在进行LEFT JOIN 连接查询时,写下这样一条语句:

  SELECT u.username,d.deptname from users as u
left join depts as d on u.dept_id = d.dept_id
where u.tenant_id = 1 and d.tenant_id = 1

语句中 tenant_id 为每一个租客对应的id,我这里假设为1
 这个sql 语句的意思就是查询租客ID为1 的用户所属的部门,
 但是这条有一个很致使的错误是查询不了没有部门的用户(users表中dept_id为空)

这个问题的出处是系统用 DOCTRINE + sfMultiTenantPlugin 进行查询时出现的,
请问有什么好的解决方法
ims2007 2011-12-15
  • 打赏
  • 举报
回复
没人顶
yangjingqzp 2011-12-06
  • 打赏
  • 举报
回复
遇到同样的问题了?顶 顶

求大侠解!!!

4,250

社区成员

发帖
与我相关
我的任务
社区描述
国内外优秀PHP框架讨论学习
社区管理员
  • Framework
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧