0

我有以下代码

public function findAccessible(Query $query, array $options){
    return $this->findPublic($query, $options)
                ->union($this->findMyAdmin($query, $options));
}

public function findPublic(Query $query, array $options){
    return $query
            ->where(['public' => true]);
}   

public function findMyAdmin(Query $query, array $options){
    return $query
            ->where(['admin_user_id' => $options['User.id']]);
}

findAccessible 调用在 Chrome 中给了我这个错误消息: ERR_EMPTY_RESPONSE 没有其他错误消息,错误日志中没有条目。我确信这是因为工会的呼吁。怎么做?

我想要实现的目标: groups hasAndBelongsTo users groups: id, name, admin_user_id, public

我想组团

1)什么是公共组(这个没问题,findPublic方法)

2)其中 admin_user 是给定的用户(这没关系,findMyAdmin 方法)

3)在给定用户是成员的地方(这没关系,我可以用另一个 find()->matching 调用来做到这一点)

4)用户可以访问的,例如。公共或给定用户是管理员或成员 - 意思是 1)、2) 和 3) 的联合 - 这就是我正在努力的问题。如果我将所有这些都放在一个查找方法中,我将无法为成员资格定义 OR 关系,因为这是通过匹配翻译成内部连接的内容来完成的。

4

1 回答 1

0

我发现了一个非常丑陋但有效的解决方案。

public function findAccessible(Query $query, array $options){
    $qq = $this->query($query);
    $memberships = $qq->matching('Users', function($q) use ($options){
                return $q->where(['Users.id' => $options['User.id']]);
                });
    foreach($memberships as $m){
        $memberInGroup[] = $m->id;
    }

    return $query
            ->where(['public' => true])
            ->orWhere(['admin_user_id' => $options['User.id']])
            ->orWhere(['Groups.id IN' => $memberInGroup]);
}

我希望有人能找到更好的解决方案并在这里发布。

于 2014-11-28T09:43:44.727 回答