web-dev-qa-db-ja.com

ビュー3.3で内部結合を左結合に変更しますか?

ビュー3.3を使用して、2つのコンテンツタイプを表示しているDrupal 7にビューがあります。コンテンツタイプの1つにのみ接続されているフィールドの値に基づくフィルター基準があります。 。そのフィールド基準がある限り、ビューはINNER JOIN、そのフィールドがアタッチされていない最初のコンテンツタイプのビューを返さないようにします。

ビューからクエリをコピーし、INNERLEFT結合に変更して、それをmysqlシェルに貼り付け、期待どおりのすべての行を取得しました。しかし、ビューエディターでこれらの変更を行う方法がわかりません。

ビューエディターの 'relationship'ブロックで遊んでいましたが、結合の種類を変更できる場所がわかりませんでした。

ビュー3.3の結合方法を変更できますか?

7
user1359

hook_views_query_alter()を使用して変更しました。 $ viewおよび$ queryオブジェクトへの参照を取得します。ビューの名前をチェックして、目的のビューであるかどうかを確認し、目的のテーブルのクエリオブジェクトの結合タイプを変更しました。

function my_module_views_query_alter(&$view, &$query) {
  if($view->name == 'my_view') {
    $query->table_queue['field_data_field_my_field']['join']->type = "LEFT";
  }
}
10
user1359

reduce duplicatesチェックボックスが変換されましたINNER JOINsからLEFT JOINs

depicting reduce duplicates tickbox

次のようなものをクエリに挿入する前に:

INNER JOIN {field_data_field_random_field field_data_field_random_field} 
        ON node.nid = field_data_field_random_field.entity_id 
       AND (field_data_field_random_field.entity_type = 'node' 
       AND field_data_field_random_field.deleted = '0')

これらの内部結合は単純な分類フィルターによって引き起こされていたため、残念なことに、不要な関係はありませんでした。ただし、このチェックボックスをオンにしても、他の方法でクエリが変更されたようには見えないため、内部結合を削除しないでください。そして、生命と呼ばれるこの広大なサルの冒険で他の誰かを助けるかもしれません。

18
Pebbl

ビューの[関係]タブに移動すると、[この関係を必須にする]というチェックボックスがあります。

enter image description here

  1. このチェックボックスを選択すると、次のことを意味します。内部結合を作成する
  2. このチェックボックスをオフにすると、次のことを意味します:左結合を行う
4
Gokul N K

AND/ORグループをビューで使用している人のために、完全性のためにいくつかの情報を追加するだけです。

私は、最後の2つの条件を切り替えると、内部結合と左結合の間でそれを変更するフィルター基準を持っています。

私の現在のフィルター基準を説明すると、基本的にこれは:

(Published = "Yes" AND Content Type = "Blog) AND ((Blog Type = "X") OR (Blog Type IS NULL))

これは、INNER JOINを使用しており、希望する結果が得られません。 OR=の最後の2つの条件を交換するだけで、JOINタイプが変更されます。

(Published = "Yes" AND Content Type = "Blog) AND ((Blog Type IS NULL) OR (Blog Type = "X"))

これはLEFT JOINを使用します。図に行くが、他の誰かのために役立つ可能性があります。

1
Cameron

ビューフィルターによっては、パッチが必要になる場合があります https://www.drupal.org/node/1766338

0
sagesolutions