0

多対多の接続がUser -> Addressあり、ソフト削除可能なプラグインを使用しています。

アドレスがリンクされていないすべてのユーザーを検索するクエリを作成する必要があります。論理的な削除を使用しないと、次のように問題なく動作します。

$qb = $this->getRepository()->createQueryBuilder('users');
$qb->andWhere('users.addresses IS EMPTY');

ここで、softdeletable が有効になってAddressいて、ユーザーのすべてのアドレスを削除した場合でも、結果にこのユーザーが返されます。これは、上記のクエリが次の SQL (簡略化) に変換されるために発生しています。

SELECT * FROM users u WHERE 
   (SELECT COUNT(*) FROM user_address ua WHERE ua.user_id = u.user_id) = 0)

ご覧のとおり、Addressエンティティに参加していないため、deletedAt列に関する手がかりがありません。

だから私の質問は、DQLクエリを書き直してdeletedAtを認識させ、そのようなレコードを除外する方法です。

ありがとう!

4

1 に答える 1

0

次のようなサブクエリで解決しました:

$qb = $this->getRepository()->createQueryBuilder('u'); //Select Users

$subquery = '
    SELECT DISTINCT 1 FROM Address AS a2
    JOIN a2.users AS u2
    WHERE u2=u
';
$qb->andWhere('NOT EXISTS(' . $subquery . ')');
于 2014-12-04T14:01:50.653 に答える