Laravel merge relationships

前端 未结 4 609
深忆病人
深忆病人 2020-11-29 09:21

Is there a way to merge 2 relationships in laravel?

this is the way it\'s setup now, but Is there a way I could return both merged?

  public function         


        
相关标签:
4条回答
  • 2020-11-29 09:46

    Try out getter method for property which returns merged collections returned from relations.

    public function getCompetitionsAttribute($value)
    {
        // There two calls return collections
        // as defined in relations.
        $competitionsHome = $this->competitionsHome;
        $competitionsGuest = $this->competitionsGuest;
    
        // Merge collections and return single collection.
        return $competitionsHome->merge($competitionsGuest);
    }
    

    Or you can call additional methods before collection is returned to get different result sets.

    public function getCompetitionsAttribute($value)
    {
        // There two calls return collections
        // as defined in relations.
        // `latest()` method is shorthand for `orderBy('created_at', 'desc')`
        // method call.
        $competitionsHome = $this->competitionsHome()->latest()->get();
        $competitionsGuest = $this->competitionsGuest()->latest()->get();
    
        // Merge collections and return single collection.
        return $competitionsHome->merge($competitionsGuest);
    }
    
    0 讨论(0)
  • 2020-11-29 09:48

    In case you prefer merge() method to combine two collections (relationships), it will override elements with the same index keys so you will loose some of your data gained from one relationship.

    You should choose push() method instead, which creates new array keys by pushing one collection to the end of other collection

    Here is a sample :

    public function getCompetitionsAttribute($value) {
        $competitionsHome = $this->competitionsHome;
        $competitionsGuest = $this->competitionsGuest;
    
        // PUSH ONE TO OTHER!
        return $competitionsHome->push($competitionsGuest);
    }
    
    0 讨论(0)
  • If anyone landed here like me due to google: As neither merge() nor push() allow eager loading (and other nice relation features), the discussion didn't end with this thread but was continued here: Laravel Eloquent Inner Join on Self Referencing Table

    I proposed a solution here, any further ideas and contributions to this issue welcome.

    0 讨论(0)
  • 2020-11-29 10:07

    I've created a package for merging relationships using views:
    https://github.com/staudenmeir/laravel-merged-relations

    First, create the merge view in a migration:

    use Staudenmeir\LaravelMergedRelations\Facades\Schema;
    
    Schema::createMergeView(
        'competitions',
        [(new YourModel)->CompetitionsHome(), (new YourModel)->CompetitionsGuest()]
    );
    

    Then define the relationship:

    class YourModel extends Model
    {
        use \Staudenmeir\LaravelMergedRelations\Eloquent\HasMergedRelationships;
    
        public function competitions()
        {
            return $this->mergedRelationWithModel(Competition::class, 'competitions');
        }
    }
    

    Use it like any other relationship:

    $model->competitions;
    
    $model->competitions()->paginate();
    
    YourModel::with('competitions')->get();
    
    0 讨论(0)
提交回复
热议问题