2016-04-07 2 views
3

私はFOSUserBundleを使用するSymfony 2.7 Webアプリケーションを開発中です。これまではすべてうまく動作します。管理バックエンドを追加して、異なるユーザーの詳細を表示することはできません。他のユーザーのデータへのアクセス方法は?

$contact_count = $this->contactsCountForUser(5); 
... 

public function contactsCountForUser($user_id) { 
    $repo = $this->em->getRepository('AppBundle:Contact'); 

    $qb = $repo->createQueryBuilder('c'); 
    $qb->select('COUNT(c)'); 
    $qb->where('c.user = :userId'); 
    $qb->setParameter('userId', $user_id);   

    $sql = $qb->getQuery()->getSql(); 
    $count = $qb->getQuery()->getSingleScalarResult(); 

    return $count; 
} 

以下は、SQLクエリとして作成されますので、これは、失敗します:

SELECT COUNT(c0_.guid) AS sclr0 FROM contact c0_ WHERE (c0_.user_id = ?) AND (c0_.user_id = '1') 
選択したユーザーが作成したどのように多くの連絡先を参照することができるはずの電話帳Appで例えば

問題1: なぜ$qb->where('c.user = :userId')c0_.user_id = ?に翻訳されていますか?なぜ5 beeingがuser_idとして使われていないのですか?

問題2: AND (c0_.user_id = '1')が自動的にクエリに追加されます。私はこれが現在のユーザーにクエリを制限するFOSUserBundleによって行われると仮定します。ここでID 1は現在ログインしているユーザーのIDです。これはAdminです...明らかに(c0_.user_id = ?) AND (c0_.user_id = '1')は真実ではありません。

So:DoctrineやFOSUserBundleを納得させるには、管理者が他のユーザーのデータに対してクエリを実行できるようにする必要がありますか?

サードパーティのコードの一部がUserAware注釈としてSQLFilterを追加します。@LBAのコメントに

+0

パラメータ '$ user_id'は有効ですか?彼の価値をダンプしようとしてみてください... –

+0

はい私は。変数を削除し、 'qb-> setParameter( 'userId'、5)'や 'qb-> setParameter( 'userId'、 '5')'(引用符で5)のようなハードコーディングされた値を使用しても、同じ結果を得る –

+0

あなたはクエリが正しいと思われ、何も間違っているとは思えません...今度はあなたの関数 'print 'メソッド内でこのコードを追加しようとします:public function contactsCountForUser($ user_id)';' maybe ** contactsCountForUser **は他のところで再定義されています.... –

答えて

1

おかげで、私は、問題の原因を見つけることができました。 This webpageは、何が行われ、どのように動作するかを詳細に記述する。

多分これが「問題」のこの種を回避し、問題点1について:-)

「間違った」であるかを把握するために他人を助けることができます。でも、問題2を解決した後、問題1は同じです。 userIdは依然としてクエリ内で?に変換されます。しかし、これはコードの機能に影響を与えないようです。私がすべて見ることができる限り、期待どおりに働いています。

+1

私はあなたが言っていることを理解していると思います。あなたが(教義で)準備された声明を使用しているからです。 – Mattia

+1

@Mattiaは正しかった - これは、ここで準備されたステートメントを使用しているからです - 本当のSQLには?パラメータに置き換えられます。 – LBA

関連する問題