web-dev-qa-db-ja.com

EntityFieldQueryを使用してフィールド「field_parent」を持たないエンティティ/ノードをクエリする方法は?

エンティティ参照モジュールを使用しており、親が定義されていないすべてのノードを選択します。私は試しています:

$query = new EntityFieldQuery();
$children = $query
    ->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'page')
    ->propertyCondition('status', 1)
    ->fieldCondition('field_parent', 'target_id', null, 'IS NULL')
    ->execute();

..しかし、フィールド "field_parent"が欠落しており、NULLに設定されていないため、何も表示されません。 IS NOT NULLを使用する場合、親を持つすべてのノードを取得します。

親がない(またはフィールド「field_parent」がない)すべてのノードを選択するにはどうすればよいですか?


Cliveのおかげで、私は次の方法でこれを解決することができました。

$query = new EntityFieldQuery();
$children = $query
    ->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'page')
    ->propertyCondition('status', 1)
    ->addTag('filter_no_parent')
    ->execute();

/**
* Implements hook_query_TAG_alter()
*/
function mymodule_query_filter_no_parent_alter(QueryAlterableInterface $query) {
    $query->leftJoin('field_data_field_parent', 'p', 'node.nid = p.entity_id');
    $query->isNull('p.field_parent_target_id');
}
6
tirithen

あなたは(生まれつき)私は恐れることはできません。 EntityFieldQueryIS NULLまたはIS NOT NULLをサポートしていません。

ただし、回避策はありますが、基本的にはクエリにタグを追加し、必要なLEFT JOINおよびIS NULLステートメントを追加するクエリ変更フックを実装します。

コード例については、 EntityFieldQueryはisNullまたはisNotNullをサポートしない を参照してください。以前にそのコードを使用したことがあり、良い結果が得られました。

5
Clive