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., (*1)
, (*2)
Installation
You just require using composer and you're good to go!, (*3)
composer require rackbeat/laravel-morph-where-has
The Service Provider is automatically registered., (*4)
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., (*5)
Our solution, is that you define every possible morphed class. Like so:, (*6)
<?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
php
Invoice::whereHas('supplier', function($query) {
$query->whereName('John Doe');
})->get();
, (*7)
This will correctly query a relation with the type and any queries you've added., (*8)
Requirements
Inspiration
Solution based upon work by github@thisdotvoid - modified to fix some common issues., (*9)