You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
We have a micro services architecture and we work with multiple databases within MySQL.
In our laravel-lumen application version 10, when we specify different mysql models using different database names through the connection property, while using HybridRelations, we get the error
Call to undefined method Illuminate\Database\Eloquent\Relations\BelongsToMany::getOwnerKeyName()
Model A uses hybrid relations and its table resides in mysql database 1
It has a many to many relationship with Model B.
It also has a one to one relationship with Model C.
It has property protected $connection = database_1
Model B does not use hybrid relations and its table resides in mysql database 2
It has a many to many relationship with Model A.
It has property protected $connection = database_2
Model C has a collection that resides in MongoDB.
Expected behaviour
When querying Model A like so :
$candidateUserIds = A::whereHas('B', function ($query) use ($b_ids) {
$query->whereIn('b_table.id', $b_ids);
})->get();
It should return results, respecting the condition on its relationship.
Actual behaviour
Get the error :
Call to undefined method Illuminate\Database\Eloquent\Relations\BelongsToMany::getOwnerKeyName()
This is because of this function here :
mongodb > laravel-mongodb > src > Helpers > trait QueriesRelationships
public function has($relation, $operator = '>=', $count = 1, $boolean = 'and', ?Closure $callback = null)
In particular line 56
if (Model::isDocumentModel($this->getModel()) || $this->isAcrossConnections($relation)) {
return $this->addHybridHas($relation, $operator, $count, $boolean, $callback);
}
The following function returns true.
protected function isAcrossConnections(Relation $relation)
{
return $relation->getParent()->getConnectionName() !== $relation->getRelated()->getConnectionName();
}
In my case both model A and model B are in mysql, but because they have different connection names, they are considered hybrid relationships and laravel thinks that Model B is in MongoDB.
The temporary fix was to remove the connection property from Model B and specify the database name in the property
protected $table = 'database_2.b_table';
Would it be possible to check the driver property of the connections instead ?
The text was updated successfully, but these errors were encountered:
Description:
We have a micro services architecture and we work with multiple databases within MySQL.
In our laravel-lumen application version 10, when we specify different mysql models using different database names through the connection property, while using HybridRelations, we get the error
Call to undefined method Illuminate\Database\Eloquent\Relations\BelongsToMany::getOwnerKeyName()
Expected behaviour
When querying Model A like so :
$candidateUserIds = A::whereHas('B', function ($query) use ($b_ids) {
$query->whereIn('b_table.id', $b_ids);
})->get();
It should return results, respecting the condition on its relationship.
Actual behaviour
Get the error :
Call to undefined method Illuminate\Database\Eloquent\Relations\BelongsToMany::getOwnerKeyName()
This is because of this function here :
mongodb > laravel-mongodb > src > Helpers > trait QueriesRelationships
In my case both model A and model B are in mysql, but because they have different connection names, they are considered hybrid relationships and laravel thinks that Model B is in MongoDB.
The temporary fix was to remove the connection property from Model B and specify the database name in the property
protected $table = 'database_2.b_table';
Would it be possible to check the driver property of the connections instead ?
The text was updated successfully, but these errors were encountered: