Skip to content

Commit 6e43216

Browse files
luisdalmolinopencode
andcommitted
Fix latestOfMany relationships using wrong foreign key in subqueries
When using leftJoinRelationship with latestOfMany relationships that have custom foreign keys, the generated subquery was incorrectly using the parent model's primary key instead of the relationship's local key. This caused wrong join conditions and incorrect query results. 🤖 Generated with [opencode](https://opencode.ai) Co-Authored-By: opencode <[email protected]>
1 parent 7a2e5e1 commit 6e43216

File tree

4 files changed

+9
-9
lines changed

4 files changed

+9
-9
lines changed

src/Mixins/RelationshipsExtraMethods.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -299,20 +299,20 @@ protected function performJoinForEloquentPowerJoinsForHasMany()
299299
$column = $this->getOneOfManySubQuery()->getQuery()->columns[0];
300300
$fkColumn = $this->getOneOfManySubQuery()->getQuery()->columns[1];
301301

302-
$builder->where(function ($query) use ($column, $joinType, $joinedModel, $builder, $fkColumn) {
303-
$query->whereIn($joinedModel->getQualifiedKeyName(), function ($query) use ($column, $joinedModel, $builder, $fkColumn) {
302+
$builder->where(function ($query) use ($column, $joinType, $joinedModel, $builder, $fkColumn, $parentTable) {
303+
$query->whereIn($joinedModel->getQualifiedKeyName(), function ($query) use ($column, $joinedModel, $builder, $fkColumn, $parentTable) {
304304
$columnValue = $column->getValue($builder->getGrammar());
305305
$direction = Str::contains($columnValue, 'min(') ? 'asc' : 'desc';
306306

307307
$columnName = Str::of($columnValue)->after('(')->before(')')->__toString();
308308
$columnName = Str::replace(['"', "'", '`'], '', $columnName);
309309

310310
if ($builder->getConnection() instanceof MySqlConnection) {
311-
$query->select('*')->from(function ($query) use ($joinedModel, $columnName, $fkColumn, $direction, $builder) {
311+
$query->select('*')->from(function ($query) use ($joinedModel, $columnName, $fkColumn, $direction, $parentTable) {
312312
$query
313313
->select($joinedModel->getQualifiedKeyName())
314314
->from($joinedModel->getTable())
315-
->whereColumn($fkColumn, $builder->getModel()->getQualifiedKeyName())
315+
->whereColumn($fkColumn, "{$parentTable}.{$this->localKey}")
316316
->orderBy($columnName, $direction)
317317
->take(1);
318318
});
@@ -321,7 +321,7 @@ protected function performJoinForEloquentPowerJoinsForHasMany()
321321
->select($joinedModel->getQualifiedKeyName())
322322
->distinct($columnName)
323323
->from($joinedModel->getTable())
324-
->whereColumn($fkColumn, $builder->getModel()->getQualifiedKeyName())
324+
->whereColumn($fkColumn, "{$parentTable}.{$this->localKey}")
325325
->orderBy($columnName, $direction)
326326
->take(1);
327327
}

tests/LatestOfManyJoinTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public function test_left_join_relationship_with_latest_of_many_uses_correct_for
3737
// in the subquery for latestOfMany
3838
// Expected: all joins should use kvh_code
3939
// Actual: subquery uses addresses.id instead of addresses.kvh_code
40-
40+
4141
// This assertion will fail because the subquery incorrectly uses addresses.id
4242
$this->assertStringNotContainsString('"requested_addresses"."kvh_code" = "addresses"."id"', $query);
4343
}
@@ -73,4 +73,4 @@ public function test_left_join_relationship_with_latest_of_many_returns_correct_
7373
$this->assertNotNull($result);
7474
$this->assertEquals('KVH456', $result->kvh_code);
7575
}
76-
}
76+
}

tests/Models/Address.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,4 @@ public function latest_requested_address(): HasOne
3434
->one()
3535
->latestOfMany('requested_at');
3636
}
37-
}
37+
}

tests/Models/RequestedAddress.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@ public function address(): BelongsTo
2323
{
2424
return $this->belongsTo(Address::class, 'kvh_code', 'kvh_code');
2525
}
26-
}
26+
}

0 commit comments

Comments
 (0)