Drupal 5インストールからDrupal 8にSQLステートメントを転送し、And/Or条件に苦労しています。たとえば、元のSQLが与えられた場合:
SELECT .....
WHERE .....
AND classes.description = "Photographer"
AND (classoptions.description = "Name of photographer here"
OR classoptions.description = "Not assigned").
私はそれを次のように翻訳しました:
$query = $this->dbConnection->select('classes');
....etc....
$query->condition('classes.description', 'Photographer');
ここまでは順調ですね。次に、ORの条件が必要です
$query->condition('classoptions.description', 'Name of photographer here');
$query->condition('classoptions.description', 'Not assigned');
オンラインでドキュメントを見る場合は、次のようにdb_or()を使用することをお勧めします。
$query->condition(db_or()
->condition('classoptions.description', 'Name of photographer here');
->condition('classoptions.description', 'Not assigned'));
..しかし、これはa)非推奨であり、b)エラー 'db_or function not found'が発生しますdb_or()の代わりは、新しいConditionオブジェクトを取得することですが、どうすればよいですか?関数
$query->orConditionGroup();
新しいConditionオブジェクトとコードを返します
$query->condition(orConditionGroup()
->condition('classoptions.description', 'Name of photographer here');
->condition('classoptions.description', 'Not assigned'));
正常にOR処理される条件を使用してConditionオブジェクトをフォーマットしますが、これをクエリに組み込むにはどうすればよいですか?
コアでのorConditionGroup()
の使用方法を確認してください。たとえば、ConfigEntityQueryTest
では次のように使用されます。
$query = $this->factory->get('config_query_test', 'AND');
$and_condition_1 = $query->orConditionGroup()
->condition('id', '2')
->condition('label', $this->entities[0]->label);
$and_condition_2 = $query->orConditionGroup()
->condition('id', 1)
->condition('label', $this->entities[3]->label);
$this->queryResults = $query
->condition($and_condition_1)
->condition($and_condition_2)
->execute();
これを問題に適用できると思います。
完全を期すために、これは私にとってはうまくいきました(元のポスターのおかげで):
$query = \Drupal::entityQuery('taxonomy_term')
->condition('vid', 'surface');
$group = $query->orConditionGroup()
->condition('field_surface_exclude', NULL, 'IS NULL')
->condition('field_surface_exclude', 0);
$tids = $query->condition($group)->execute();