दो विचारों का एक संघ कैसे बनाएं?


36

मैं एक उपयोगकर्ता के नोड्स और "पोस्ट डेट" द्वारा हल की गई टिप्पणियों का एक संघ प्राप्त करने की कोशिश कर रहा हूं। यह पोस्ट D6 के लिए सैंडबॉक्स प्रोजेक्ट से लिंक करता है लेकिन 7 के लिए कुछ भी नहीं है।

इस पोस्ट में D6 में Hook_views_pre_execute () और SQL UNION का उपयोग करने का एक उदाहरण है। यह D7 के लिए दृश्य 3 के साथ काम नहीं करता है।

मुझे मर्लिनोफॉस की टिप्पणी आई

क्योंकि अब हम Drupal के नए क्वेरी जनरेटर का उपयोग कर रहे हैं, क्वेरी एक SelectQuery ऑब्जेक्ट है जिसे आपको संशोधित या बदलना होगा। अधिक जानकारी के लिए Drupal 7 की नई डेटाबेस परत देखें।

क्या किसी के पास ऐसा करने का कोई उदाहरण है या दो विचारों के संयोजन के लिए कोई अन्य समाधान है?


यह एक वास्तविक उत्तर की तुलना में एक विचार से अधिक है: आपको उपयोगकर्ताओं के आधार पर एक दृश्य बनाने में सक्षम होना चाहिए, जो नोड्स और टिप्पणियों दोनों में शामिल होंगे (वे दोनों सिर्फ संस्थाओं के बाद :)। अपने पहले प्रयास में मैं ऐसा करने में विफल रहा क्योंकि दृश्य उपयोगकर्ता से हास्य के संबंध की पेशकश नहीं करते हैं। लेकिन इसे बदलना आसान होना चाहिए। (या मैं कुछ भूल गया)।
मौजिस

मुझे लगता है कि यह नीचे के रूप में एक ही जवाब है: केटी को दो प्रासंगिक फिल्टर (सामग्री। उपयोक्ता = उपयोगकर्ता में लॉग इन करना होगा। टिप्पणी = उपयोक्ता = उपयोगकर्ता में लॉग इन करना होगा)।
उवे

मुझे ऐसा नहीं लगता :) मेरा मतलब है कि उपयोगकर्ताओं पर आधारित एक दृश्य, नोड्स और टिप्पणियों में शामिल होना। लेकिन मुझे लगता है कि उपयोगकर्ता और टिप्पणी के बीच के संबंध में कुछ समस्या है - मैंने टिप्पणी दिखाने का प्रबंधन नहीं किया।
मौजिस

मैं सिर्फ अनुमान लगा रहा हूं लेकिन क्या आप एक ही समय में कई निकाय प्रकारों को अनुक्रमित करने के लिए searchapi का उपयोग नहीं कर सकते हैं? एक बार जब आपके पास है और आपके पास एक ऐसा क्षेत्र है जो दोनों भागों द्वारा उपयोग किया जाता है तो आप इसका उपयोग उस तरह के दृश्य को प्राप्त करने के लिए कर सकते हैं।
डेनियल वीनर

1
ड्रुपल 7 के लिए सैंडबॉक्स प्रोजेक्ट 'व्यूज यूनियनाइज' है, कृपया drupal.org/sandbox/jalama/1785294 ,
अनूप जोसेफ

जवाबों:


15

यहाँ एक काम कर रहा है और परीक्षण उदाहरण:

/**
 * Implements hook_views_pre_execute().
 */
function mymodule_views_pre_execute(view &$view) {
  if ($view->name == 'my_view') {
    $query1 = &$view->build_info['query'];

    // Basic setup of the second query.
    $query2 = db_select('another_table', 'at')
      ->condition('some_field', 0, '>')
      ->condition('some_other_field', 12345);

    // The number of fields (and their aliases) must match query1.
    // Get the details with:
    // dpm($query1->getFields());
    $query2->addField('at', 'some_field', 'alias1');
    $query2->addField('at', 'some_other_field', 'alias2');
    $query2->addField('at', 'some_other_field2', 'alias3');
    $query2->addField('at', 'some_other_field3', 'alias4');

    // Verify that queries are very similar.
    // dpq($query1);
    // dpq($query2);

    // Matrimony.
    $query1 = $query2->union($query1, 'UNION ALL');

    // Manual test.
    // dpm($query1->execute()->fetchAll());

  }
}

यह ज्यादातर विचारों के लिए काम करता है। हालाँकि कुछ शैली प्लगइन्स फैंसी सामान कर सकते हैं जो इस तकनीक के साथ काम नहीं करेंगे (कैलेंडर मॉड्यूल जो मैं आपको देख रहा हूं)।


3

आप एसक्यूएल यूनिअन प्रश्नों को दो अलग-अलग विचारों / डिस्प्ले से उत्पन्न करने के लिए व्यू एक्स्ट्रा हैंडलर मॉड्यूल का उपयोग कर सकते हैं।

यहाँ drupal.org पर एक विस्तृत ट्यूटोरियल

https://www.drupal.org/project/views_extra_handlers दृश्यों का स्क्रीनशॉट सेटिंग बदल देता है


2

मैंने SQL UNIONs बनाने के लिए db_query () का उपयोग किया और फिर थीम () फ़ंक्शन का उपयोग करते हुए पेजर सहित तालिका लेआउट में रेंडर किया।

उपयोगकर्ता के लिए यह डिफ़ॉल्ट दृश्य जैसा दिखता है। दूसरा लाभ यह था कि मैं क्वेरी को बहुत अधिक अनुकूलित कर सकता था। मैं "मेरे मित्र की गतिविधियों" को दिखा रहा हूं और यदि आप इसके लिए विचारों का उपयोग करेंगे तो यह आपके दोस्तों की एक सूची बनाएगा और इसे SQL "IN" खंड में उपयोग करेगा जो बहुत ही धीमा है यदि आपके पास 50 या 100 से अधिक रिकॉर्ड हैं।

मैं उन मित्रों की सूची को केवल उन लोगों तक ही सीमित कर सकता हूं जो पिछले x दिनों में साइट में लॉग इन हुए हैं।

यह एक कोड नमूना है:

  // Two queries are required (friendships can be represented in 2 ways in the
  // same table). No point making two db calls though so a UNION it is.

  // Build up the first query.
  $query = db_select('flag_friend', 'f')
    ->condition('f.uid', $account->uid)
    ->condition('u.login', $timestamp, '>');
  $query->addExpression('f.friend_uid', 'uid');
  $query->innerJoin('users', 'u', 'u.uid = f.friend_uid');

  // Build up the second query.
  $query2 = db_select('flag_friend', 'f')
    ->condition('f.friend_uid', $account->uid)
    ->condition('u.login', $timestamp, '>');
  $query2->addExpression('f.uid', 'uid');
  $query2->innerJoin('users', 'u', 'u.uid = f.uid');

  // Return the results of the UNIONed queries.
  return $query->union($query2)->execute()->fetchCol();

1

भविष्य के संदर्भ के लिए, यह है कि मैंने एक ही टेबल पर दो विचारों को एक साथ जोड़ दिया। समान सिद्धांतों को भी अलग-अलग तालिकाओं पर समान क्षेत्रों वाले विचारों पर आधारित होना चाहिए।

नीचे दिए गए मामले में केवल आईडी का चयन किया जाता है क्योंकि प्रारूप को प्रदान की गई इकाई में सेट किया जाता है। लेकिन अगर आप उन फ़ील्ड्स के साथ जा रहे हैं, तो आप हमेशा क्वेरी में अतिरिक्त डमी फ़ील्ड जोड़ सकते हैं, जिसमें कम फ़ील्ड हैं जैसा कि मैंने नीचे टाइमस्टैम्प जोड़ा है।

/**
 * Implements hook_views_pre_execute().
 */
function MY_MODULE_views_pre_execute(&$view) {
  if ($view->name == 'VIEW_1' && $view->current_display == 'DISPLAY_OF_VIEW_1') {

    $view2 = views_get_view('VIEW_2');
    $view2->build('DISPLAY_OF_VIEW_2');

    $view->build_info['query']
    ->fields('table_alias', array('timestamp'))
    ->union(
        $view2->build_info['query']
        ->range()
        ->fields('table_alias', array('timestamp'))
        ->orderBy('timestamp', 'DESC')
    );

    $view->build_info['count_query']
    ->union(
        $view2->build_info['count_query']
        ->range()
    );
  };
}

0

मैं इन पंक्तियों के साथ इसकी कुछ कल्पना करता हूं:

/** 
* Implements hook_views_pre_execute().
*/     
function mymodule_views_pre_execute(&$view) {
  if ($view->name == 'myview') {
    $query = $view->query;
    $other_view = views_get_view('otherview');
    $other_query = $other_view->query;
    $query = $query->union($other_query);
    $view->query = $query;
  }
}

हालांकि मैंने इसका परीक्षण नहीं किया है।

कुछ लिंक जो मदद कर सकते हैं:

http://api.drupal.org/api/drupal/includes!database!select.inc/function/SelectQueryInterface%3A%3Aunion/7

http://drupal.org/node/557318#comment-1991910


1
यह पूरी तरह से काम नहीं करता है। $ दृश्य-> क्वेरी वह मध्यवर्ती ऑब्जेक्ट है, जिसका उपयोग क्वेरी बनाने के लिए करता है। SelectQuery $ दृश्य है-> build_info ['क्वेरी']। जब आप तदनुसार संपादित करते हैं, तो मैं "घातक त्रुटि: अपरिभाषित विधि पर कॉल नहीं कर सकता हूं। SelectQuery :: प्रस्तुत_प्रदर्शन ()" त्रुटि।
mpdonadio

1
डेटाबेस टेस्ट कोड में यूनियनों के उदाहरण हैं api.drupal.org/api/drupal/… और api.drupal.org/api/drupal/…
mikeytown2

एक और उदाहरण drupal.org/node/748844#comment-7070234
uwe

यह संभवतः एक ही तरीका हो सकता है अगर दोनों दृश्य लगभग समान हों।
दलिन

0

मुझे व्यू फील्ड व्यू नामक एक मॉड्यूल मिला , जो आपको एक दृश्य को दूसरे दृश्य में फ़ील्ड के रूप में एम्बेड करने की अनुमति देता है। मैंने इसे अभी तक स्वयं अभी तक नहीं आज़माया है, लेकिन यह आपके लिए उपयोगी हो सकता है।


2
जबकि व्यू फील्ड व्यू वास्तव में टिप्पणी और नोड्स दोनों प्राप्त कर सकते हैं, मेरा मानना ​​है कि केवल उनके भीतर, फ़ील्ड्स में सॉर्ट करने का एक तरीका है।
०२:२६ पर सुस्ती

0

EntityFieldQuery दृश्य बैकएंड ही समय में एकाधिक इकाई प्रकार के लिए समर्थन क्वेरी। तो यह नोड्स और टिप्पणियों दोनों के लिए क्वेरी करने के लिए उपयोग करने योग्य होना चाहिए। दोनों निकाय प्रकार uidएपीआई स्तर पर अपने लेखक से लिंक करने के लिए एक संपत्ति का उपयोग करते हैं इसलिए EntityFieldQuery :: propertyCondition () एकल उपयोगकर्ता से नोड्स और टिप्पणियों का चयन करने के लिए उपयोग करने योग्य होना चाहिए। मुझे लगता है कि बैकएंड एक ही सुविधा प्रदान करता है।


ऐसा लगता है जैसे उन्होंने कई संस्थाओं को क्वेरी करने के लिए सुविधा को हटा दिया: drupal.org/node/1564740
uwe

0

एक अलग दृष्टिकोण नोड्स और टिप्पणियों के फ़ीड (URL में उपयोगकर्ता के पहचानकर्ता के एक प्रासंगिक फिल्टर के साथ) बनाने के लिए हो सकता है और फिर दोनों फ़ीड को एक नए फ़ीड में संयोजित कर सकते हैं, और पोस्ट दिनांक तक इसे प्रदर्शित कर सकते हैं।


-2

ग्लोबल इस्तेमाल किया : PHP खेतों? आप उन्हें एक साथ एक दृश्य है कि दोनों को जोड़ती है टेप डक्ट करने के लिए उपयोग कर सकते हैं।

सामग्री के साथ सामग्री का एक दृश्य बनाएँ: शीर्षक और सामग्री: टिप्पणियाँ फ़ील्ड (प्रदर्शन से अलग)।

एक PHP फ़ील्ड जोड़ें जो गणना करता है कि अधिक हाल ही में, अंतिम अपडेट की गई तिथि, या उपयोगकर्ता द्वारा अंतिम टिप्पणी की तारीख, और उस दिनांक के लिए फ़ील्ड का मान सेट करें। उस फ़ील्ड को सॉर्ट स्थिति के रूप में जोड़ें।

एक समान फ़ील्ड जोड़ें जो या तो टिप्पणी या नोड के लिंक को आउटपुट करता है।

यह मुझे अच्छा लगता है!


दिलचस्प विचार है। इसके लिए दो संदर्भ फ़िल्टरों की आवश्यकता होगी (content.author = उपयोगकर्ता में लॉग इन करें या टिप्पणी करें ।author = उपयोगकर्ता में लॉग इन किया गया)।
उवे

इस पर महाकाव्य वसूली पाने की उम्मीद ...;)
जॉनथन एलमोर

2
इस दृष्टिकोण से मारा जाने वाला प्रदर्शन डरावना होगा। डेटाबेस प्रश्नों की संभावित संख्या खगोलीय पर बोर्डर कर सकती है।
राइडर_एक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.