web-dev-qa-db-ja.com

条件の配列をdoctrine expr()-> orx()メソッドに渡す

このようなQueryBuilderを使用してDQLを構築する必要があります

[QUERY]... AND WHERE e.type = x OR e.type = Y OR e.type = N [...]

配列に型があります。この配列をクエリビルダーに渡すにはどうすればよいですか?

$qb->andWhere($qb->expr()->orx(CONDITIONS));

タイプのリストは動的になり、各foreachタイプのループで$qb->andWhereを呼び出すと、ANDが増えるだけで、WHEREはORになります。
乗算orx式を保存してからandWhereに追加できますか?これを解決する方法、おそらく一般的な問題はありますか?

36

明日はもっといい日になると思っていた。解決策は簡単です。あなたはOR式の配列をそのように作ることができます

$ors[] = $qb->expr()->orx('e.type = '.$qb->expr()->literal($value));

そして、それを次のように結合メソッドを介してクエリビルダーのandWhere()/ Where()メソッドに追加します:

$qb->andWhere(join(' OR ', $ors));
12

私はそう願っています、そして私はこれを見つけました:

$conditions = array('e.type = x', 'e.type = Y', 'e.type = N');
$orX = $qb->expr()->orX();

foreach ($conditions as $condition) {
    $orX->add($condition);
}

$qb->add('where', $orX);

@meze提案を使用すると、コードを簡略化してforeachステートメントを次のように置き換えることができます。

$orX->addMultiple($conditions);
68
DEY

@DEY彼の答えは簡略化できます。 foreachは必要ありません。これも機能します。

$conditions = array('e.type = x', 'e.type = Y', 'e.type = N');

$orX = $qb->expr()->orX();
$orX->addMultiple($conditions);

$qb->where($orX);
11
Wilt

次のように...をphpで使用することもできます。

$conditions = array('e.type = x', 'e.type = Y', 'e.type = N');
$criteria = Criteria::create();
$criteria->andWhere(Criteria::expr()->orX(...$conditions));
5
Karol Gasienica

call_user_func_array 関数 このように を使用することもできます。

配列の項目をパラメーターとして渡すメソッドを呼び出すことができます。

1
Jens