সুস্পষ্ট ওআরএম ব্যবহার করে লারাভেলে বাল্ক সন্নিবেশ


156

এলওভারেন্ট ওআরএম ব্যবহার করে আমরা কীভাবে লারাভেলে বাল্ক ডাটাবেস সন্নিবেশ সম্পাদন করতে পারি?

আমি লারাভেলে এটি সম্পাদন করতে চাই: https://stackoverflow.com/a/10615821/600516 তবে আমি নিম্নলিখিত ত্রুটিটি পাচ্ছি।

এসকিউএলসেট [এইচওয়াই ৯৯৩]: অবৈধ প্যারামিটার নম্বর: মিশ্র নামযুক্ত এবং অবস্থানগত পরামিতি।


1
has_manyআপনার মডেলগুলির সাথে আপনার কি সম্পর্ক রয়েছে?
পাপাস্মার্ফ

1
@ জোনাথান্দে এই মুহুর্তে আমার কোনও সম্পর্ক নেই
ফিনিক্সউইজার্ড

@ ডেভিড বার্কার আমি লুপ ফর লুপ ব্যবহার করে কোয়েসার স্ট্রিং গঠনের চেষ্টা করেছি। লারাভেলে লেনদেন ব্যবহার করার চেষ্টাও করেছি।
ফিনিক্সউইজার্ড

@ আরমভূসাল আপনি কি আপনার কোড পোস্ট করতে পারবেন? আমি নিশ্চিত আমার এখানে কিছু কোড রয়েছে যা আপনাকে সাহায্য করবে help
ডেভিড বার্কার

উত্তর:


302

আপনি শুধু ব্যবহার করতে পারেন Eloquent::insert()

উদাহরণ স্বরূপ:

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

Coder::insert($data);

2
এটি কি এখনও লারাভেল 4 এর জন্য প্রযোজ্য?
এডভোকেট

4
@ অদ্বৈত: হ্যাঁ, এটি এখনও লারাভেল 4-এ প্রযোজ্য
ওলা

37
এটি Eloquentআসলে স্পর্শ করে না তা লক্ষণীয় । এটি কেবল Query\Builder@insert()পদ্ধতিতে কলটির প্রক্সি করে । দক্ষতার সাথে একাধিক সারি সুনির্দিষ্টভাবে সন্নিবেশ করার কোনও উপায় নেই এবং এটি বাল্ক সন্নিবেশগুলির জন্য কোনও পদ্ধতিও সরবরাহ করে না।
জেরেক টাকাকজেক

6
@ ক্যানভালাল টাইমস্ট্যাম্পগুলি আপডেট / তৈরি করতে আমাদের কী করা উচিত?
মিলন মহার্জান

3
এটি একটি সন্নিবেশ ব্যবহার করবে। সুতরাং, একটি বড় যথেষ্ট অ্যারে দেওয়া, এটি ব্যর্থ হবে।
পেট্রাক্স

72

টাইমস্ট্যাম্পগুলি সহজেই আপডেট করার জন্য আমরা জিটিএফ উত্তর আপডেট করতে পারি

$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);

আপডেট: @ পেড্রো মোরিড়ার পরামর্শ অনুসারে আমরা কার্বনটি ব্যবহার করতে পারি সেই তারিখটি সহজ করতে

$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);

আপডেট 2: লারাভেল 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
সদ্য newlyোকানো সারিগুলির সমস্ত আইডি আমরা কীভাবে পেতে পারি?
akshaykumar6

2
'ইউটিসি' কেন? এটি কি প্রকল্পের অগ্রাধিকার, বা, বুদ্ধিমান সবসময় 'ইউটিসি'তে কাজ করে?
পাইলট

6
আমি একটি বিশাল "স্পেস স্পেস বনাম ট্যাব" যুক্তি শুরু করতে চাই না, তবে দয়া করে ইউটিসিতে টাইমস্ট্যাম্পগুলি সংরক্ষণ করুন! এটি পরে আপনার প্রচুর পরিমাণে ব্যথা বাঁচাবে! বিশ্বব্যাপী ব্যবহারকারীদের সম্পর্কে চিন্তা করুন :)
আইএসএস

2
যদি আমি জিজ্ঞাসা করতে পারি, Carbonএই পরিস্থিতিতে বড় প্রয়োজন কী? এর সাথে কী হয়েছে date("Y-m-d H:i:s")?
ইফেদী ওকনকো

29

যে কেউ এটি পড়ছেন, তার জন্য 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()
খনন করুন

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);

োকানোর আগে পুরো অ্যারেটিতে তৈরি_এটি এবং আপডেটড_এট যুক্ত করা ধারণা The


0

Illuminate\Database\Query\Builderলারাভেল ৫.7 থেকে আপনি সন্নিবেশ ব্যবহারের পদ্ধতিটি ব্যবহার করতে পারেন।

$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
@ এমিলিবার্গারন আমি আপনার সাথে একমত আমি আমার পোস্টটি সম্পাদনা করেছি যাতে এটি ভাল বাল্ক সন্নিবেশনে সহায়তা করতে পারে। লুপ (কার্বন, বিক্রিপট) থেকে অনেক বেশি সময় নিবে এমন কাজগুলি ছেড়ে যাওয়ার বিষয়টি বিবেচনা করে এটি আপনাকে অনেক সময় সাশ্রয় করতে পারে।
ফ্রান্সিসকো ড্যানিয়েল

-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();
    }
}

"$ اعتراض = নতুন স্ব ()" ছাড়াই এটি কেবলমাত্র একক রেকর্ড সংরক্ষণ করে (যখন $ আপত্তি ছিল এটি ছিল)


-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();
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.