দুটি স্বতন্ত্র সংগ্রহগুলি কীভাবে মার্জ করবেন?


87

আমার কাছে একটি প্রশ্ন টেবিল এবং একটি ট্যাগ টেবিল রয়েছে। আমি একটি প্রদত্ত প্রশ্নের ট্যাগগুলি থেকে সমস্ত প্রশ্ন আনতে চাই। সুতরাং, উদাহরণস্বরূপ, আমার দেওয়া কোনও প্রশ্নের সাথে "ভ্রমণ," "ট্রেন" এবং "সংস্কৃতি" ট্যাগ থাকতে পারে। আমি এই তিনটি ট্যাগের জন্য সমস্ত প্রশ্ন আনতে সক্ষম হতে চাই। কৌতূহলী, সুতরাং এটি দেখে মনে হচ্ছে যে প্রশ্ন এবং ট্যাগগুলির সম্পর্কটি অনেকগুলি-অনেকেরই এলওভার্ট-এ টোম্যানির হিসাবে সংজ্ঞায়িত।

আমি নীচে হিসাবে প্রশ্ন সংগ্রহগুলি মার্জ করার চেষ্টা সম্পর্কে ভেবেছিলাম:

foreach ($question->tags as $tag) {
    if (!isset($related)) {
        $related = $tag->questions;
    } else {
        $related->merge($tag->questions);
    }
}

যদিও এটি কাজ করে না বলে মনে হচ্ছে। কিছুই মার্জ করা হয় না বলে মনে হচ্ছে। আমি কি এটি সঠিকভাবে চেষ্টা করছি? এছাড়াও, এলোউটারে একাধিক থেকে বহু সম্পর্কের মধ্যে সারি সারি আনার আরও ভাল উপায় কি সম্ভব?


আপনি কি আগ্রহী লোডিং এবং পদ্ধতিটি সম্পর্কে ডকুমেন্টেশন পরীক্ষা করেছেন? আপনার ইস্যুটি আরও ভাল বুদ্ধিমান কোয়েরি ব্যবহার করে সহজেই সমাধান করা যেতে পারে। আমি যখন কোনও কম্পিউটারের পেছনে ফিরে যাই তবে আমি উদাহরণ লিখব যদি না কেউ আমাকে এটির কাছে মারে।
লুসিওস

4
@Luceos withসাহায্য করবে না। এটি whereHasপ্রয়োজন - নীচের উত্তরের মতো।
জারেক টাকাকজেক

হ্যাঁ, আমার ভুল; আপনি সঠিক
Luceos

উত্তর:


139

মার্জ পদ্ধতিটি মার্জড সংগ্রহটি ফিরিয়ে দেয়, এটি মূল সংগ্রহকে রূপান্তরিত করে না, সুতরাং আপনাকে নিম্নলিখিতগুলি করা দরকার

$original = new Collection(['foo']);

$latest = new Collection(['bar']);

$merged = $original->merge($latest); // Contains foo and bar.

আপনার কোডটিতে উদাহরণ প্রয়োগ করা হচ্ছে

$related = new Collection();

foreach ($question->tags as $tag)
{
    $related = $related->merge($tag->questions);
}

4
আমি একটি গাছ থেকে ফ্ল্যাট তালিকা তৈরি করার চেষ্টা করছিলাম, পুশ ব্যবহার করে আমার যা প্রয়োজন ছিল তা করা হয়েছিল, তবে পূর্বাভাসের পদ্ধতিটি সত্যই সহায়তা করেছিল।
জর্জ

মনে রাখবেন যে স্বতন্ত্র সংগ্রহগুলি সাধারণ সংগ্রহগুলির মতো আচরণ করে না, যেমন। তারা getKeyফলাফলগুলি মার্জ করার জন্য ব্যবহার করে, তাইModel::all()->merge(Model::all())->count() === Model::all()->count()
এআইটিড

34

এর merge()পদ্ধতিটি Collectionসংগ্রহটিকে পরিবর্তিত করে না যেখানে এটি কল করা হয়েছিল। এতে মেশানো নতুন ডেটা সহ এটি একটি নতুন সংগ্রহ দেয় You আপনার প্রয়োজন হবে:

$related = $related->merge($tag->questions);

যাইহোক, আমি মনে করি আপনি ভুল কোণ থেকে সমস্যাটি মোকাবেলা করছেন।

যেহেতু আপনি একটি নির্দিষ্ট মানদণ্ড পূরণ করে এমন প্রশ্নগুলির সন্ধান করছেন, তাই সম্ভবত এই পদ্ধতিতে জিজ্ঞাসা করা সহজ হবে। has()এবং whereHas()পদ্ধতি একটি সম্পর্কিত রেকর্ড অস্তিত্ব উপর ভিত্তি করে একটি ক্যোয়ারী জেনারেট করতে ব্যবহার করা হয়।

আপনি যদি কেবল কোনও ট্যাগ রয়েছে এমন প্রশ্নের সন্ধান করেন তবে আপনি এই has()পদ্ধতিটি ব্যবহার করবেন । যেহেতু আপনি একটি নির্দিষ্ট ট্যাগ দিয়ে প্রশ্নগুলি খুঁজছেন, আপনি whereHas()শর্তটি যুক্ত করতে এটি ব্যবহার করবেন ।

সুতরাং, আপনি যদি 'ট্র্যাভেল', 'ট্রেনস' বা 'সংস্কৃতি' এর সাথে অন্তত একটি ট্যাগযুক্ত সমস্ত প্রশ্ন চান তবে আপনার ক্যোয়ারীটি এমন দেখাচ্ছে:

$questions = Question::whereHas('tags', function($q) {
    $q->whereIn('name', ['Travel', 'Trains', 'Culture']);
})->get();

আপনি যদি এই তিনটি ট্যাগযুক্ত সমস্ত প্রশ্ন চেয়েছিলেন তবে আপনার ক্যোয়ারীটি এমন দেখাচ্ছে:

$questions = Question::whereHas('tags', function($q) {
    $q->where('name', 'Travel');
})->whereHas('tags', function($q) {
    $q->where('name', 'Trains');
})->whereHas('tags', function($q) {
    $q->where('name', 'Culture');
})->get();

4
+ তবে 2nd (সমস্ত ট্যাগ) অপশনের সাহায্যে আপনি পরামর্শ সরলীকৃত হতে পারে: stackoverflow.com/a/24706347/784588
Jarek Tkaczyk

তবে আপনি ট্যাগের নামগুলি হার্ডকোড করতে পারবেন না। এই উদাহরণে, প্রশ্নটি এই ট্যাগগুলির সাথে দেখা যায়, তবে অন্যান্য প্রশ্নে ট্যাগগুলি পৃথক হবে
অলফারিড মোরেলস গার্সিয়া


11

দুটি পৃথক স্পষ্টত কালেকশন একের সাথে মার্জ করুন এবং কিছু আইটেম একই আইডির সাথে ঘটে থাকে, একজন অন্যটিকে ওভাররাইট করে দেবে। পরিবর্তে পুশ () পদ্ধতিটি ব্যবহার করুন বা সমস্যা এড়ানোর জন্য আপনার পদ্ধতির পুনর্বিবেচনা করুন। ওয়েব দেখুন


ধন্যবাদ, এটি আমাকে এখানে পাওয়া মন্তব্যে পরিণত করেছে मध्यम.com/@jeffparr_57441/… যা পরিষ্কারভাবে ওভাররাইটিং ছাড়াই কাজটি করছে বলে মনে হচ্ছে।
চিহ্নিত করুন

1

সকলেই আমার পক্ষে সুস্পষ্ট সংগ্রহগুলিতে কাজ করে না , লর্যাভল স্পষ্ট বিবরণী সংগ্রহগুলি আইটেমগুলি থেকে কীটি ব্যবহার করে যা আমার মনে হয় যা মার্জিংয়ের সমস্যাগুলির কারণ হয়, আপনাকে প্রথম সংগ্রহটি একটি অ্যারে হিসাবে ফিরে পাওয়া দরকার, তা একটি নতুন সংগ্রহের মধ্যে রাখা এবং তারপরে অন্যগুলিকে ধাক্কা দিতে হবে নতুন সংগ্রহ;

public function getFixturesAttribute()
{
    $fixtures = collect( $this->homeFixtures->all() );
    $this->awayFixtures->each( function( $fixture ) use ( $fixtures ) {
        $fixtures->push( $fixture );
    });
    return $fixtures;
}

1

প্রতিটি সুস্পষ্ট সংগ্রহের জন্য একটি নতুন বেস সংগ্রহ তৈরি করা আমার জন্য মার্জটি কাজ করে।

$foo = collect(Foo::all());
$bar = collect(Bar::all());
$merged = $foo->merge($bar);

এই ক্ষেত্রে এর প্রাথমিক কী দ্বারা দ্বন্দ্ব নেই have

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.