laravel/framework

Inconsistent orWhere behavior after upgrade from Laravel 10.x to 13.x

Open

#59,516 opened on Apr 3, 2026

View on GitHub
 (4 comments) (0 reactions) (0 assignees)PHP (11,882 forks)batch import
help wanted

Repository metrics

Stars
 (34,705 stars)
PR merge metrics
 (Avg merge 1d 22h) (129 merged PRs in 30d)

Description

Laravel Version

v13.2.0

PHP Version

8.3.30

Database Driver & Version

mariadb Ver 15.1 on arm64 (Homebrew)

Description

When doing something along the lines of:

$query
                        ->where([
                            ['source_type', '=', Role::class],
                            ['source_id', '=', $obj->guestRole->id],
                        ])
                        ->orWhere([
                            ['source_type', '=', Group::class],
                            ['source_id', '=', $obj->loggedOutGroup->id],
                        ]);

previously, it would generate a conditional with:

(source_type=? AND source_id=?) OR (source_type=? AND source_id=?)

After the upgrade to Laravel 13 it's now generating the following conditional (note the OR in the second block):

(source_type=? AND source_id=?) OR (source_type=? OR source_id=?)

While looking into this I discovered #53184 from 11.28 causing this issue. However, it says it was fixed in #53197 but I'm still seeing this behavior in 13.x

Steps To Reproduce

$query
                        ->where([
                            ['source_type', '=', Role::class],
                            ['source_id', '=', $obj->guestRole->id],
                        ])
                        ->orWhere([
                            ['source_type', '=', Group::class],
                            ['source_id', '=', $obj->loggedOutGroup->id],
                        ]);

Use this as a conditional

Contributor guide