लारवेल में बल्क सम्मिलन एलोक्वेंट ओआरएम का उपयोग करके


156

हम कैसे लारवल में थोक डेटाबेस सम्मिलन का प्रदर्शन कर सकते हैं एलोक्वेंट ओआरएम का उपयोग कर?

मैं लारवेल में इसे पूरा करना चाहता हूं: https://stackoverflow.com/a/10615821/600516 लेकिन मुझे निम्नलिखित त्रुटि मिल रही है।

SQLSTATE [HY093]: अमान्य पैरामीटर संख्या: मिश्रित नाम और स्थितीय पैरामीटर।


1
क्या has_manyआपके मॉडल पर कोई संबंध है?
PapaSmurf

1
@jonathandey no i न इस समय कोई संबंध नहीं है
फीनिक्सविल्ड

@DavidBarker i ने लूप के लिए क्वायर स्ट्रिंग बनाने की कोशिश की है। मैंने लार्वा में लेनदेन का उपयोग करने की भी कोशिश की है।
फीनिक्सविल्ड

@AramBhuse क्या आप अपना कोड पोस्ट कर सकते हैं? मुझे यकीन है कि मेरे पास यहां कुछ कोड हैं जो आपकी मदद करेंगे।
डेविड बार्कर

क्या आपने laravel.com/docs/database/eloquent#mass-assignment देखा है ?
बेंजामिन

जवाबों:


302

आप बस उपयोग कर सकते हैं Eloquent::insert()

उदाहरण के लिए:

$data = array(
    array('name'=>'Coder 1', 'rep'=>'4096'),
    array('name'=>'Coder 2', 'rep'=>'2048'),
    //...
);

Coder::insert($data);

2
क्या यह अभी भी लारवेल 4 पर लागू होता है?
advait

4
@ अद्वैत: हाँ, यह अब भी लारवेल पर लागू होता है 4.
ओला

37
यह देखते हुए कि यह Eloquentवास्तव में स्पर्श नहीं करता है। यह सिर्फ कॉल टू Query\Builder@insert()मेथड है। एलक्वेंट के साथ कई पंक्तियों को कुशलतापूर्वक सम्मिलित करने का कोई तरीका नहीं है, और न ही यह थोक आवेषण के लिए कोई विधि प्रदान करता है।
जारेक टकाज़ीक

6
@CanVural हमें टाइमस्टैम्प भी अपडेट / बनाने के लिए क्या करना चाहिए?
मिलन महाराजन

3
यह एक सम्मिलित का उपयोग करेगा। तो, एक बड़ा पर्याप्त सरणी दिया, यह विफल हो जाएगा।
पेट्रोक्स

72

हम टाइमस्टैम्प को आसानी से अपडेट करने के लिए GTF उत्तर को अपडेट कर सकते हैं

$data = array(
    array(
        'name'=>'Coder 1', 'rep'=>'4096',
        'created_at'=>date('Y-m-d H:i:s'),
        'modified_at'=> date('Y-m-d H:i:s')
       ),
    array(
         'name'=>'Coder 2', 'rep'=>'2048',
         'created_at'=>date('Y-m-d H:i:s'),
         'modified_at'=> date('Y-m-d H:i:s')
       ),
    //...
);

Coder::insert($data);

अपडेट: दिनांक को सरल बनाने के लिए हम कार्बन का उपयोग कर सकते हैं जैसा कि @Pedro Moreira ने सुझाव दिया है

$now = Carbon::now('utc')->toDateTimeString();
$data = array(
    array(
        'name'=>'Coder 1', 'rep'=>'4096',
        'created_at'=> $now,
        'modified_at'=> $now
       ),
    array(
         'name'=>'Coder 2', 'rep'=>'2048',
         'created_at'=> $now,
         'modified_at'=> $now
       ),
    //...
);

Coder::insert($data);

UPDATE2: लार्वा 5 के लिए, के updated_atबजाय का उपयोग करेंmodified_at

$now = Carbon::now('utc')->toDateTimeString();
$data = array(
    array(
        'name'=>'Coder 1', 'rep'=>'4096',
        'created_at'=> $now,
        'updated_at'=> $now
       ),
    array(
         'name'=>'Coder 2', 'rep'=>'2048',
         'created_at'=> $now,
         'updated_at'=> $now
       ),
    //...
);

Coder::insert($data);

42
या $nowचर को परिभाषित करने के लिए स्क्रिप्ट की शुरुआत में कार्बन का उपयोग करें $now = Carbon::now('utc')->toDateTimeString();:। तो बस 'created_at' => $now, 'updated_at' => $nowहर प्रविष्टि के लिए उपयोग करें ।
पेड्रो मोरिरा

2
हम नई सम्मिलित पंक्तियों की सभी आईडी कैसे प्राप्त कर सकते हैं?
अक्षयकुमार 6

2
क्यों 'utc'? क्या यह परियोजना की प्राथमिकता है, या, वाक्पटु हमेशा 'utc' में काम करता है?
विमान

6
मैं एक विशाल "रिक्त स्थान बनाम टैब" तर्क शुरू नहीं करना चाहता, लेकिन कृपया, UTC में टाइमस्टैम्प सहेजें! यह आपको बाद में बहुत बड़ी मात्रा में दर्द से बचाएगा! विश्व स्तर पर उपयोगकर्ताओं के बारे में सोचें :)
iSS

2
अगर मैं पूछ सकता हूं कि Carbonइस स्थिति में बड़ी जरूरत क्या है? इसमें गलत क्या है date("Y-m-d H:i:s")?
इफेडि ओकोनकॉवो

30

जो कोई भी इसे पढ़ रहा है, वह createMany()विधि देखें

/**
 * Create a Collection of new instances of the related model.
 *
 * @param  array  $records
 * @return \Illuminate\Database\Eloquent\Collection
 */
public function createMany(array $records)
{
    $instances = $this->related->newCollection();

    foreach ($records as $record) {
        $instances->push($this->create($record));
    }

    return $instances;
}

28
यह वह नहीं है जिसे बल्क इंसर्ट कहा जाता है। खराब कार्यान्वयन के कारण, यह फ़ंक्शन आइटम के अनुसार एक ही क्वेरी को तैयार और निष्पादित करेगा।
पॉल स्पीगल

यह ध्यान देने योग्य है कि यह एक संबंध विधि है, इसे सीधे मॉडल से नहीं बुलाया जा सकता है Model::createMany()
Digout

24

यह है कि आप इसे अधिक स्पष्ट तरीके से कैसे करते हैं,

    $allintests = [];
    foreach($intersts as $item){ //$intersts array contains input data
        $intestcat = new User_Category();
        $intestcat->memberid = $item->memberid;
        $intestcat->catid= $item->catid;
        $allintests[] = $intestcat->attributesToArray();
    }
    User_Category::insert($allintests);

3

मैंने इसके लिए कई बार खोज की, अंत में timestampsनीचे की तरह कस्टम का इस्तेमाल किया :

$now = Carbon::now()->toDateTimeString();
Model::insert([
    ['name'=>'Foo', 'created_at'=>$now, 'updated_at'=>$now],
    ['name'=>'Bar', 'created_at'=>$now, 'updated_at'=>$now],
    ['name'=>'Baz', 'created_at'=>$now, 'updated_at'=>$now],
    ..................................
]);

2

Eloquent::insert उचित समाधान है, लेकिन यह टाइमस्टैम्प को अपडेट नहीं करेगा, इसलिए आप नीचे जैसा कुछ कर सकते हैं

 $json_array=array_map(function ($a) { 
                        return array_merge($a,['created_at'=> 
                                            Carbon::now(),'updated_at'=> Carbon::now()]
                                           ); 
                                     }, $json_array); 
 Model::insert($json_array);

डालने से पहले संपूर्ण सरणी पर create_at और updated_at जोड़ने का विचार है


0

Laravel 5.7 से Illuminate\Database\Query\Builderआप सम्मिलित विधि का उपयोग कर सकते हैं।

$query = [];
foreach($oXML->results->item->item as $oEntry){
    $date = date("Y-m-d H:i:s")
    $query[] = "('{$oEntry->firstname}', '{$oEntry->lastname}', '{$date}')";
}

Builder::insertUsing(['first_name', 'last_name', 'date_added'], implode(', ', $query));

-1
$start_date = date('Y-m-d h:m:s');        
        $end_date = date('Y-m-d h:m:s', strtotime($start_date . "+".$userSubscription['duration']." months") );
        $user_subscription_array = array(
          array(
            'user_id' => $request->input('user_id'),
            'user_subscription_plan_id' => $request->input('subscription_plan_id'),
            'name' => $userSubscription['name'],
            'description' => $userSubscription['description'],
            'duration' => $userSubscription['duration'],
            'start_datetime' => $start_date,
            'end_datetime' => $end_date,
            'amount' => $userSubscription['amount'],
            'invoice_id' => '',
            'transection_datetime' => '',
            'created_by' => '1',
            'status_id' => '1', ),
array(
            'user_id' => $request->input('user_id'),
            'user_subscription_plan_id' => $request->input('subscription_plan_id'),
            'name' => $userSubscription['name'],
            'description' => $userSubscription['description'],
            'duration' => $userSubscription['duration'],
            'start_datetime' => $start_date,
            'end_datetime' => $end_date,
            'amount' => $userSubscription['amount'],
            'invoice_id' => '',
            'transection_datetime' => '',
            'created_by' => '1',
            'status_id' => '1', )
        );
        dd(UserSubscription::insert($user_subscription_array));

UserSubscriptionमेरा मॉडल नाम है यह "सही" लौटाएगा यदि सफलतापूर्वक "गलत" डालें।


-1

हो सकता है कि इस समस्या को हल करने के लिए एक अधिक लारवेल तरीका संग्रह का उपयोग करना है और इसे टाइमस्टैम्प का लाभ उठाते हुए मॉडल के साथ सम्मिलित करना है।

<?php

use App\Continent;
use Illuminate\Database\Seeder;

class InitialSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        collect([
            ['name' => 'América'],
            ['name' => 'África'],
            ['name' => 'Europa'],
            ['name' => 'Asia'],
            ['name' => 'Oceanía'],
        ])->each(function ($item, $key) {
            Continent::forceCreate($item);
        });
    }
}

संपादित करें:

मेरी गलतफहमी के लिए मुझे माफ़ करें। थोक डालने के लिए यह मदद कर सकता है और हो सकता है कि इसके साथ आप अच्छे सीडर बना सकें और उन्हें थोड़ा अनुकूलित कर सकें।

<?php

use App\Continent;
use Carbon\Carbon;
use Illuminate\Database\Seeder;

class InitialSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $timestamp = Carbon::now();
        $password = bcrypt('secret');

        $continents = [
            [
                'name' => 'América'
                'password' => $password,
                'created_at' => $timestamp,
                'updated_at' => $timestamp,
            ],
            [
                'name' => 'África'
                'password' => $password,
                'created_at' => $timestamp,
                'updated_at' => $timestamp,
            ],
            [
                'name' => 'Europa'
                'password' => $password,
                'created_at' => $timestamp,
                'updated_at' => $timestamp,
            ],
            [
                'name' => 'Asia'
                'password' => $password,
                'created_at' => $timestamp,
                'updated_at' => $timestamp,
            ],
            [
                'name' => 'Oceanía'
                'password' => $password,
                'created_at' => $timestamp,
                'updated_at' => $timestamp,
            ],
        ];

        Continent::insert($continents);
    }
}

1
यह प्रति आइटम एक क्वेरी बनाता है। यह एक थोक प्रविष्टि नहीं है।
एमिल बर्जरोन

1
@EmileBergeron मैं आपसे सहमत हूँ। मैंने अपनी पोस्ट को संपादित कर दिया है, तो शायद इससे अच्छी थोक प्रविष्टि करने में मदद मिल सके। उन कार्यों को छोड़ने पर विचार करना जो लूप (कार्बन, बीक्रिप्ट) से बहुत समय लेते हैं, यह आपको बहुत समय बचा सकता है।
फ्रांसिस्को डैनियल

-1

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

foreach($arCategories as $v)
{                
    if($v>0){
        $obj = new Self(); // this is to have new instance of own
        $obj->page_id = $page_id;
        $obj->category_id = $v;
        $obj->save();
    }
}

बिना "$ obj = new Self ()" यह केवल एकल रिकॉर्ड बचाता है (जब $ obj यह $ था)


-4

समस्या हल हुई ... माइग्रेट के लिए ऑल्टर टेबल

$table->timestamp('created_at')->nullable()->useCurrent();

उपाय:

Schema::create('spider_news', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('source')->nullable();
    $table->string('title')->nullable();
    $table->string('description')->nullable();
    $table->string('daterss')->nullable();

    $table->timestamp('created_at')->useCurrent();
    $table->timestamp('updated_at')->useCurrent();
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.