一纠结问题:
环境 数据库映射组件 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);
}