web-dev-qa-db-ja.com

既存のビュー結合を変更する方法は?

既存のビュー結合を変更しようとしています。

「langcode」条件を削除しようとしているとしましょう。

これまでのところ:

function mymodule_views_query_alter(Drupal\views\ViewExecutable $view, Drupal\views\Plugin\views\query\Sql $query) {
    $joindata = $query->getJoinData("node__field_joined_whatever", "node_field_data");

//$joindata contains the join I need, so far so good

    foreach($joindata->extra as $ix=>$val) {
      if (isset($val['field']) && $val['field'] == 'langcode') {
        unset($joindata->extra[$ix]);
      }
    }
//here I have modified join object, but there is nothing like '$query->setJoinData()'
...
}

変更された結合をクエリに戻す方法を誰かが知っていますか?

1
Alexey Smirnoff

通常、ビューの事前関係オプションを使用して結合タイプを制御する必要があります。 「この関係が必要」を有効にすることで、「左」結合ではなく「内部」結合を使用するようにビューに指示しています。このオプションがどういうわけかここで機能しない場合、私はこの問題を解決する方法です。

use \Drupal\views\ViewExecutable;
use \Drupal\views\Plugin\views\query\QueryPluginBase;

function hook_views_query_alter(ViewExecutable $view, QueryPluginBase $query) {
   // check your view ID:
if ($view->id() === 'id') {
 //Get your table info object;
  $table = $query->getTableInfo('table');
if (isset($table['join']->type) && $table['join']->type === "INNER") {
//Change your Join type;
 $table['join']->type = 'LEFT';
   }
 }
}
4
Jay Chand

役立つ別の例。独自の条件を追加して参加する方法。私の場合、結合されたエンティティのタイトルが経営者と等しくないことを確認します。

if ($view->current_display === 'my_display') {
  $table = $query->getTableInfo('MY_TABLE');
  // Make 'extra' and array if it's empty.
  $table['join']->extra = empty($table['join']->extra) ? [] : $table['join']->extra;
  $table['join']->extra[] = [
    'field' => 'title',
    'value' => 'management',
    'operator' => '!='
  ];
}

「MY_TABLE」の代わりにテーブルのエイリアスを使用できます。

0
Eugene