2011-07-27 2 views
4

Drupal(ビューバージョン3、Drupalバージョン7)のビューのクエリを変更しようとしています。テーブルの追加、場所、および並べ替えビューのビューviews_query_alter()のクエリ

実行したいのは、実行する前にクエリを変更して、ノードにウェイトが割り当てられているテーブルをLEFTジョインすることです。

私はSQLにするクエリを書くことだった場合、それは次のようになります。

SELECT a.nid, a.title, a.description 
    FROM node a 
    LEFT OUTER JOIN node_weights b 
    ON a.nid = b.nid 
    WHERE b.uid = $uid 
    ORDER BY b.weight DESC 

私は、クエリアナライザでそれを実行すると、このクエリはチャンピオンのように動作します。だから、私は自分のモジュールで動作させる必要があります。

ビューのクエリを変更するさまざまな方法について、さまざまなブログで詳しく説明されている複数のアプローチがありますが、異なるバージョンのビューに対処しているようです。だから、私が見ているものが私のアプリケーションのために働く可能性があるかどうかを判断しようとするのは非常に混乱します。

私が関係が、私は参加したいテーブルとノードテーブルの間でどのような見解を伝えるためにMODULE_NAME_views_tables()関数を使用する必要があるようです。

function MODULE_NAME_views_tables() { 
     $tables['node_weights'] = array(
     "name" => "node_weights", 
     "join" => array(
      "left" => array(
      "table" => "node", 
      "field" => "nid" 
     ), 
      "right" => array(
      "field" => "nid" 
     ), 
     ), 
    ); 
     return $table; 
    } 

これが働いているように見えるん私はクエリ配列を見てKrumoを使用する場合、私は私の「node_weights」の表を参照してくださいので、私はMODULE_NAME.views.incに以下の機能を追加しました

「table_queue」要素に格納されます。 views_query_alter()関数で

、私はそれがこのような何かを仕事したいと思います:

function MODULE_NAME_views_query_alter(&$view, &$query) { 
     $uid = $_COOKIE['uid']; 
     $view->query->add_relationship('node_weights', new views_join('node_weights', 'nid', 'node', 'nid','LEFT')); 
     $view->query->add_where('node_weights', "node_weights.uid", $uid); 
     krumo($query); 
    } 

この機能はかなりひどくbarfs。私の結合テーブルは$ viewオブジェクトに現れていますが、add_relationshipメソッドは3番目の引数にエラーを投げていますが、3つの引数を持つオンラインの例はありません。

また、私のadd_whereメソッドが正しくないことは確かですが、入力が実際にどのようなものになるかはわかりません。これは盲目の推測です。

node_weightsテーブルにノードテーブルを参加させ、そのクエリで重みを使用して降順で結果を並べ替えることを確認します。ここで、ユーザーID =ユーザーIDテーブルに格納され、テーブルはnidフィールドで結合されます。

ありがとうございます。

+0

私はできませんなんらかの理由で私自身の質問に答えを投稿するが、私はこれに対する解決策を見つけたので、コメントで説明しようとする。 – user830694

+0

最初のステップは、HOOK_views_table()を使用して新しいテーブルの結合におけるデータ関係を記述する関数を設定することです。 – user830694

+0

次のステップは、HOOK_views_query_alter()関数を作成することです。この機能の中には、いくつかの項目を追加する必要があります。 – user830694

答えて

3

私はhook_views_query_alter機能に参加を作成するOPのコメントが役に立ったと評価していたので、私は、私はより消化答えで有用であることが分かっ部品を置きたいのです。 私はDrupal 6xでViews 2xを使用していましたが、D7 Views 2で使用するのと非常によく似ていると想定します。

OPは、hook_views_tableでの結合の関係を記述しています。カスタムテーブルにリンクしていないので、これは私には必要ではありませんでしたが、コアに存在していました。

HOOK_views_query_alter()関数で作成への参加はしかし非常に有用だった:


$join = new views_join; 
$join->construct('table_name', 
     'node', // left table 
     'nid', // left field 
     'nid', // field 
    ) 

は、より多くの情報のためviews_join::construct documentationを参照してください。特に、OPが使用した「余分な」パラメータを使用する必要はありませんでした。おそらくこれはカスタムテーブルで必要です。あなたは、クエリの両方ができ

// Add join to query; 'node' is the left table name 
$view->query->add_relationship('table_name',$join,'node'); 

// Add fields from table (or where clause, or whatever) 
$view->query->add_field('table_name','field_name'); 
... 
4

のwheresはあなたが登録しよ持って一度に追加するのは簡単です:。

最後に、クエリに参加追加、および他のどんな要素がそこから必要とされています変更する(Drupal 7)。

あなただけ行うことができますので、あなたはすでに、パラメータの$クエリを持っていない
function MODULE_NAME_views_query_alter(&$view, &$query){ 

//only alter the view you mean to 
if($view->name == 'VIEW NAME' && $view->current_display == 'DISPLAY'){ 

    //create the join 
    $join = new views_join(); 
    $join->table = 'table_name'; 
    $join->field = 'entity_id'; 
    $join->left_table = 'node'; 
    $join->left_field = 'nid'; 
    $join->type = 'left'; 
    //add the join the the view query 
    $view->query->add_relationship('table_name',$join,'node'); 

    //add the where 
    $view->query->where[1]['conditions'][] = array(
     'field' => 'table_name.collumn_name', 
     'value' => 'value', 
     'opperator' => '=' 
    ); 
}} 
0

myhook_views_query_alter(&$view, &$query) { 
if ($view->name = ....) { 

    $join = new views_join(); 
    $join->construct(
    ... 
); 

    $query 
    ->add_relationship(...) 
    ->add_where(...) 
    ->add_orderby(...) 
    ... 
    ; 
} 

ます$ view-を使用する必要が>クエリ - > ...

関連する問題