डेटाबेस इन्सर्ट उदाहरण की तलाश में


12

db_insertमैनुअल पेज के अनुसार इस फ़ंक्शन को पदावनत किया जाता है और सम्मिलित करने के लिए Drupal 8 डेटाबेस कनेक्शन का उपयोग करना बेहतर होता है।

पदावनत

Drupal 8.0.x के रूप में, Drupal 9.0.0 में हटा दिया जाएगा। इसके बजाय, कंटेनर से आपकी सेवा में इंजेक्ट किया गया डेटाबेस कनेक्शन प्राप्त करें और उस पर कॉल डालें ()। उदाहरण के लिए, $ इंजेक्ट_डेटाबेस-> इन्सर्ट ($ टेबल, $ विकल्प);

अब मुझे डेटाबेस कनेक्शन और कॉल insert()विधि कैसे मिल सकती है ?


क्या आपके पास इंजेक्शन सेवाओं के साथ एक वर्ग के बाहर का मतलब है? पसंद है \Drupal::database()->insert(...);?
क्लाइव

इंजेक्शन की सेवाओं के साथ कक्षा के अंदर मेरा कोई मतलब नहीं हैclass PetmdController extends ControllerBase
मोहम्मद अली अकबरी

जवाबों:


19

डेटाबेस सेवा को इंजेक्ट करने के लिए अपने नियंत्रक वर्ग में निम्नलिखित विधियों को जोड़ें / बदलें:

use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Database\Connection;
use Symfony\Component\DependencyInjection\ContainerInterface;

class PetmdController extends ControllerBase {

  protected $database;

  public function __construct(Connection $database) {
    $this->database = $database;
  }

  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('database')
    );
  }

  public function foo() {
    $this->database->insert(...)->fields(...)->execute();
  }
}

यह कंट्रोलरबेस के लिए बहुत अच्छा काम करता है, लेकिन अगर मेरी क्लास पहले से ही कंस्ट्रक्शन में अलग-अलग वेरिएबल्स को पास कर रही है, तो मैं डेटाबेस सर्विस को कैसे इंजेक्ट करूंगा?
फेलिक्स ईव

3

Berdir उत्तर को यहां जोड़ने के लिए कि आप अपने डेटाबेस सेवा को अपने नियंत्रक में कैसे इंजेक्ट कर सकते हैं

$db = \Drupal::database();
      $query = $db->select('location','loc');
      $query->fields('loc', array('id', 'name', 'bond_goal','deposit_goal','date_created','date_updated'));
      $query->addField('loc','name','location_title');
      $table_sort = $query->extend('Drupal\Core\Database\Query\TableSortExtender')->orderByHeader($header);
      $pager = $table_sort->extend('Drupal\Core\Database\Query\PagerSelectExtender')->limit(10);

core/lib/Drupal/Core/Database/Queryअधिक जानकारी के लिए आप कक्षाओं का अध्ययन कर सकते हैं


2

सबसे पहले, जैसा कि आपका उद्धरण कहता है, यह ड्रुपल 9 के लिए पदावनत है । जिसका मतलब है कि यह वर्षों तक रहेगा और ड्रुपल 8 से कभी नहीं हटाया जाएगा।

लेकिन हाँ, इसका एक अच्छा विचार है कि पदावनत कार्यों से बचना। किसी भी अन्य पदावनत समारोह की तरह, आप हमेशा इसके क्रियान्वयन को देख सकते हैं कि यह करने का नया तरीका कैसा है। हालाँकि \ _ Drupal को कॉल करने के बजाय, आप डेटाबेस को इंजेक्ट करना चाहते हैं या आपको जो भी अन्य सेवा की आवश्यकता है, वह तब संभव है (जब आप किसी सेवा, नियंत्रक, प्रपत्र, प्लगइन, ...) में हों।


1

विकल्प 1:

$db = \Drupal::database();
$query = $db->select('k_product', 'p');
$query->fields('p', ['idpr', 'name', 'type']);
$data = $query->execute()->fetchAllAssoc('idpr', 'name', 'type');

विकल्प 2

$db = \Drupal::database();
$data = $db->query('SELECT idpr, name, code, detail FROM k_product')->fetchAllAssoc('idpr', 'name');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.