How to Merge Two Eloquent Collections?

后端 未结 6 785
梦如初夏
梦如初夏 2020-11-28 08:30

I have a questions table and a tags table. I want to fetch all questions from tags of a given question. So, for example, I may have the tags \"Travel,\" \"Trains\" and \"Cul

相关标签:
6条回答
  • 2020-11-28 08:52
    $users = User::all();
    $associates = Associate::all();
    
    $userAndAssociate = $users->merge($associates);
    
    0 讨论(0)
  • 2020-11-28 08:55

    Creating a new base collection for each eloquent collection the merge works for me.

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

    In this case don't have conflits by its primary keys.

    0 讨论(0)
  • 2020-11-28 09:06

    The merge method returns the merged collection, it doesn't mutate the original collection, thus you need to do the following

    $original = new Collection(['foo']);
    
    $latest = new Collection(['bar']);
    
    $merged = $original->merge($latest); // Contains foo and bar.
    

    Applying the example to your code

    $related = new Collection();
    
    foreach ($question->tags as $tag)
    {
        $related = $related->merge($tag->questions);
    }
    
    0 讨论(0)
  • 2020-11-28 09:06

    Merge two different eloquent collections into one and some objects happen to have the same id, one will overwrite the other. Use push() method instead or rethink your approach to the problem to avoid that. Refer to web

    0 讨论(0)
  • 2020-11-28 09:07

    The merge() method on the Collection does not modify the collection on which it was called. It returns a new collection with the new data merged in. You would need:

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

    However, I think you're tackling the problem from the wrong angle.

    Since you're looking for questions that meet a certain criteria, it would probably be easier to query in that manner. The has() and whereHas() methods are used to generate a query based on the existence of a related record.

    If you were just looking for questions that have any tag, you would use the has() method. Since you're looking for questions with a specific tag, you would use the whereHas() to add the condition.

    So, if you want all the questions that have at least one tag with either 'Travel', 'Trains', or 'Culture', your query would look like:

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

    If you wanted all questions that had all three of those tags, your query would look like:

    $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();
    
    0 讨论(0)
  • 2020-11-28 09:12

    All do not work for me on eloquent collections, laravel eloquent collections use the key from the items I think which causes merging issues, you need to get the first collection back as an array, put that into a fresh collection and then push the others into the new collection;

    public function getFixturesAttribute()
    {
        $fixtures = collect( $this->homeFixtures->all() );
        $this->awayFixtures->each( function( $fixture ) use ( $fixtures ) {
            $fixtures->push( $fixture );
        });
        return $fixtures;
    }
    
    0 讨论(0)
提交回复
热议问题