LaravelPackages.net
Acme Inc.
Toggle sidebar
rackbeat/laravel-morph-where-has

Fix whereHas for morphTo relations.

60.383
7
2.0
About rackbeat/laravel-morph-where-has

rackbeat/laravel-morph-where-has is a Laravel package for fix wherehas for morphto relations.. It currently has 7 GitHub stars and 60.383 downloads on Packagist (latest version 2.0). Install it with composer require rackbeat/laravel-morph-where-has. Discover more Laravel packages by rackbeat or browse all Laravel packages to compare alternatives.

Last updated

Use whereHas for morphed relationships in Laravel

Usually, you cant say whereHas('contact') if contact is a morphTo relationship. This package aims to fix that.

Total Downloads Latest Stable Version License

Installation

You just require using composer and you're good to go!

composer require rackbeat/laravel-morph-where-has

The Service Provider is automatically registered.

Usage

1. Add possible variations in your model

The problem, is that the morph relationship can have a hard time determining how to handle the whereHas call.

Our solution, is that you define every possible morphed class. Like so:

<?php

class Invoice extends Model {
    // Old morph relation
    public function owner() {
        return $this->morphTo('owner'); 
    }
    
    // New solution
    public function customer() {
        return $this->morphTo('owner')->forClass(App\Customer::class);
    }
    
    public function supplier() {
        return $this->morphTo('owner')->forClass(App\Supplier::class);
    }
}

2. Use whereHas

Invoice::whereHas('supplier', function($query) {
    $query->whereName('John Doe');
})->get();

This will correctly query a relation with the type and any queries you've added.

Requirements

  • PHP >= 7.1

Inspiration

Solution based upon work by github@thisdotvoid - modified to fix some common issues.

Star History Chart