web-dev-qa-db-ja.com

AND / OR条件を使用したSQLクエリ

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オブジェクトをフォーマットしますが、これをクエリに組み込むにはどうすればよいですか?

6
davem

コアでの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();

これを問題に適用できると思います。

9
Maouna

完全を期すために、これは私にとってはうまくいきました(元のポスターのおかげで):

$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();
6
miiimooo