2013-06-11 6 views
6

क्या कोई भी ऐसा करने के लिए कच्चे एसक्यूएल लिखने के बिना एक ही प्रश्न में केक को बहु-पंक्ति सम्मिलित करने के लिए वैसे भी है? SaveMany और saveAssociated विकल्प केवल एक ही लेनदेन में एकाधिक पंक्तियों को सहेजेंगे, लेकिन उस लेन-देन में एकाधिक सम्मिलन विवरण होते हैं, इसलिए ये विधियां भारी अनुप्रयोगों को लिखने का समाधान नहीं हैं।एक ही प्रश्न में एकाधिक पंक्तियों को सहेजना

पढ़ने के लिए धन्यवाद।

उत्तर

0

मुझे किसी ने बिग डाटा व्यवहार https://github.com/jmillerdesign/CakePHP_Big_Data

+0

सावधान =)। उस व्यवहार में एक (संभवतः) आसान एपीआई है, लेकिन कच्चे एसक्यूएल लिख रहा है। यदि आपका डेटा सरल नहीं है तो आपको एसक्यूएल सिंटैक्स त्रुटियां मिलेंगी - यह केवल मूल [मूल्य उद्धरण] (https://github.com/jmillerdesign/CakePHP_Big_Data/blob/master/Model/Behavior/BigDataBehavior.php# L146)। ऐसा लगता है कि यह आपको पूर्ण पंक्ति डालने/अपडेट को छोड़कर कुछ भी करने नहीं देता है।यदि आप इसे किसी भी तरह से उपयोग करना चाहते हैं तो मैं बस [insertMulti] को कॉल करने के लिए अद्यतन करने का सुझाव देता हूं (https://github.com/cakephp/cakephp/blob/master/lib/Cake/Model/Datasource/DboSource.php#L2894), अनचाहे कच्चा एसक्यूएल प्रश्न एक समस्या होने की प्रतीक्षा कर रहे हैं। – AD7six

+0

टिप्पणी के लिए धन्यवाद। – systematical

-1

हाँ आप की तरह

नीचे

getDataSource() विधि CakePHP 2.x में स्थिर है उपयोग कर सकते हैं, तो आप का उपयोग करने के लिए सक्षम होना चाहिए:

$db = ConnectionManager::getDataSource('default'); 
$db->rawQuery($some_sql); 
यहाँ

मुझे क्या करना विधि पोस्टिंग कर रहा हूँ। आपको एक बार में कई पंक्तियों को सम्मिलित करने के लिए मैन्युअल रूप से कुछ SQL कथन बनाना होगा।

कृपया मुझे बताएं कि क्या मैं आपकी और अधिक मदद कर सकता हूं।

+1

-1 'ऐसा करने के लिए कच्चे एसक्यूएल लिखने के बिना?' – AD7six

+0

मुझे पता है कि कैसे पारंपरिक एसक्यूएल के साथ ऐसा करें, मैं अपने ढांचे के भीतर रहना चाहता हूं। कच्चे एसक्यूएल अंतिम उपाय है। मैंने यह पाया: https://github.com/jmillerdesign/CakePHP_Big_Data – systematical

3

हाँ

हालांकि यह एप्लिकेशन भूमि कोड में ऐसा करना एक आम बात नहीं है, और ऐसा करने संभावना लगभग किसी भी आवेदन तर्क (सत्यापन नियमों, व्यवहार, घटनाओं आदि) का उपयोग करने के निकाल देता है। - का उपयोग कर बहु ​​आवेषण

$db = ConnectionManager::getDataSource('default'); 

$table = "stuffs"; 
$fields = array('id', 'name'); 
$values = array(
    array(1, 'one'), 
    array(2, 'two'), 
    ... 
); 

$result = $db->insertMulti($table, $fields, $values); 

तुम भी this repository उपयोगी (या तो सीधे या अपने कोड के लिए एक आधार के रूप में), जो आपके ऐप्लिकेशन डेटाबेस में स्थिरता फ़ाइलों को लोड करता है मिल सकता है: आप जिस तरह से fixtures are loaded में ऐसा करने का एक उदाहरण देख सकते ।

+1

ऐसा प्रतीत होता है कि यह अभी भी एक ही लेनदेन में लिपटे एक समय में एक पंक्ति को सम्मिलित करता है ... – systematical

+0

हां! [उस पर ध्यान नहीं दिया] (https://github.com/cakephp/cakephp/blob/master/lib/Cake/Model/Datasource/DboSource.php#L2917)। यदि आप अंतर बनाने के लिए अक्सर ऐसा कर रहे हैं, जैसा कि बड़े डेटा-व्यवहार-उत्तर के लिए टिप्पणी में उल्लेख किया गया है, तो सुनिश्चित करें कि आपका चुना गया समाधान उचित मूल्यों से बच रहा है। – AD7six

1

हाँ, Big_Data थोक डालने के लिए अच्छा विचार है की ओर इशारा किया। लेकिन AD7six नोट के रूप में, यह अभी भी मूल मूल्य उद्धरण का उपयोग करता है और डालने आईडी को वापस नहीं करता है। और आपके विचारों पर आधारित, मैंने डिफ़ॉल्ट केकपीएचपी उद्धरण और सम्मिलित रिकॉर्ड्स की आईडी को वापस करने के लिए, एक ही क्वेरी में थोक डालने के लिए छोटी लिपि लिखी।

$count = count($records); 
    $dbSource = $this->getDataSource(); 
    $table = $dbSource->fullTableName($this->table); 
    $fields = $dbSource->prepareFields($this, array('fields' => array_keys($records[0]))); 
    $values = array(); 
    foreach ($records as $index => $record) { 
     if (!is_array($record) || !$record) { 
      return null; 
     } 
     foreach ($record as $column => $value) { 
      $values[$index][$column] = $dbSource->value($value, $this->getColumnType($column)); 
     } 
     $values[$index] = '(' . implode(',', $values[$index]) . ')'; 
    } 

    $query = 'INSERT INTO %s (%s) VALUES %s;'; 

    $query = sprintf($query, $table, implode(',', $fields), implode(',', $values)); 
    if (!$dbSource->execute($query)) { 
     return false; 
    } 
    $lastInsertId = $dbSource->getConnection()->lastInsertId(); 
    $insertIds = array(); 
    for ($i = 0; $i < $count; $i++) { 
     $insertIds[] = $lastInsertId + $i; 
    } 
    return $insertIds; 
0

आप CakePHP 3.0 उपयोग कर रहे हैं आप इस सवाल का जवाब की जांच कर सकते हैं: How to use insert in query builder insert multiple records?

आप CakePHP 2 उपयोग कर रहे हैं आप इस तरह कच्चे एसक्यूएल का उपयोग करना होगा:

$sql = "INSERT INTO `people` (`name`,`title`) VALUES "; 
foreach($people as $person){ 
    list($name,$title) = $person; 
    $sql.= "('$name','$title'),"; 
} 
$this->query(substr($sql,0,-1)); 

स्रोत: Inserting Multiple Rows with CakePHP 3

संबंधित मुद्दे