it-swarm-eu.dev

Jak mohu změnit dotaz pohledu, aby používal „NEBO“?

Následuje obsah objektu $query, Který je předán do pohledu.

 [kde] => Array (
 [0] => Array (
 [klauze] => Array ([.____. [0] => typ uzlu v ('% s') [.____. [1] => node.status 0 
 [2] => node.promote 0 [.____. [3] => node.sticky 0 
) 
 [args] => Array (
 [0] => test 
) [.____. [typ] => AND 
) 
) 
 [s] => Array () 
 [group_operator] => AND 

Chci to přepsat pomocí hook_views_query_alter(). Výchozí operátoři jsou všichni AND, ale chci získat následující dotaz

 [0] => typ uzlu v ('% s') A 
 [1] => uzel.status 0 A 
 [2] => uzel.promote 0 NEBO 
 [3] => node.sticky 0 

Jak nastavím, aby poslední operátor použil „NEBO“?

db_query("SELECT content_id, count(*) AS cnt FROM {votingapi_vote} WHERE value =1 AND value_type = '%s'" , "option");

Jak mohu použít dotaz v hook_views_query_alter ()?

4
enjoylife

To je netestováno, ale myslím si, že to, co chcete dělat ve své alternativní funkci, je v souladu s tímto:

function mymodule_views_query_alter(&$query) {
  unset($query->where[0]['clauses'][2]);
  unset($query->where[0]['clauses'][3]);

  $query->where[1] = array(
    'clauses' => array(
      0 => 'node.promote <> 0',
      1 => 'node.sticky <> 0',
    ),
    'type' => 'OR',
  );
}

Toto je v podstatě přesunutí propagačních a lepivých klauzí do nového, kde je seskupení, a nastavením typu na „NEBO“ by to mělo fungovat tak, jak je uvedeno v otázce.

3
jhedstrom

Myslím, že můžete použít db_or, například pokud vytváříte novou klauzuli where, můžete použít něco takového

function mymodule_views_query_alter(&$query) {
  if ('name' == $view->name && 'page' == $view->current_display) {
    $or = db_or()
    ->condition('table.column', $value, 'NOT IN')
    ->condition('table.column', $value, 'NOT IN');
    $query->add_where(1,$or);
  }
}

Pro váš problém bude možná nutné použít foreach a najít přesný případ použití db_or

2
Rohith Pv

Uvědomuji si, že je to staré, ale myslel jsem, že na to odpovím každému, kdo to potřebuje.

Shlédnutí 7.x-3.x. dělá to prostřednictvím uživatelského rozhraní. Jednoduše přidáte filtry a pak pomocí uživatelského rozhraní filtru si můžete objednat filtry a přidat další skupiny filtrů, které můžete uspořádat ve vztazích AND nebo OR).

V tomto případě bych přidal druhou skupinu ve vztahu AND s první skupinou, ale s vztahem OR= s obsahem skupiny, který by sestával z: node.promote <> 0 = OR node.sticky <> 0.

0
Andrew Wasson