2

私はcodeigniterとdoctrineを使ってチャットアプリケーションを構築しています。

テーブル:
-ユーザー
-User_roles
-User_available

関係:
1人のユーザーには多くの役割があります。1人のuser_availableには1人のユーザーがいます。

チャットに使用できるユーザーは、user_availableテーブルにあります。

問題:
role_id7を取得していないuser_availableにすべてのユーザーを取り込む必要があります。

したがって、DQLで次のように表現する必要があります(これはSQLでもなく、言葉で表現するだけです):

SELECT * from user_available WHERE NOT user_available.User.Role.role_id = 7

本当にこれにこだわる

編集:私は不明確だったと思います。テーブルはすでにマップされており、DoctrineがINNERJOINの仕事をしてくれます。私はこのコードを使用して、最も長く待機した管理者を取得していますが、今はユーザーが必要です。

$admin = Doctrine_Query::create()
        ->select('c.id')
        ->from('Chat_available c')
        ->where('c.User.Roles.role_id = ?', 7)
        ->groupBy('c.id')
        ->orderBy('c.created_at ASC')
        ->fetchOne();

ここで、最も長く待機したユーザーを取得する必要がありますが、これは機能しません

$admin = Doctrine_Query::create()
        ->select('c.id')
        ->from('Chat_available c')
        ->where('c.User.Roles.role_id != ?', 7)
        ->groupBy('c.id')
        ->orderBy('c.created_at ASC')
        ->fetchOne();
4

2 に答える 2

1

問題はおそらく今ではなくなっていると思いますが、これが将来の読者のために私が行う方法です。

$admin = Doctrine_Query::create()
        ->select('c.id')
        ->from('Chat_available c')
        ->leftJoin('c.User u')
        ->leftJoin('u.Roles r')
        ->where('r.role_id != ?', 7)
        ->groupBy('c.id')
        ->orderBy('c.created_at ASC')
        ->fetchOne();
于 2010-04-19T11:01:00.243 に答える
0

これを行うには、最初にテーブルを結合する必要があります

内部結合を使用して user_available.id を user.id に結合します

ただし、user_available テーブルを間違って使用している可能性があると思います。user テーブルと 1 対 1 で対応付けられているため、is_available フィールドを user テーブルに追加することはできませんか?

于 2010-02-18T09:23:12.447 に答える