laravel-mongodb
laravel-mongodb copied to clipboard
Relation hasMany will not work
Hi, I am a MongoDB rookie and need your help. I have 2 simple models:
Model merchant

Controller

collection merchants

collection comments

If I only want to query the merchant, I don't have any problems, but if I want to use hasMany (relation to comments) it will not work
Illuminate\Database\Eloquent\Collection {#371 ▼ #items: [] }
Hope you can help me - many thanks
Hi bro, i also faced the same problem, then i saw this issue: https://github.com/jenssegers/laravel-mongodb/issues/1383 Hope this can help you
@inkvc17, what is the version laravel-mongodb, php driver and mongo?
@Smolevich this is related to this PR https://github.com/jenssegers/laravel-mongodb/pull/1523
Hi @Smolevich , I use
mongodb/mongodb 1.5.1 jenssegers/mongodb v3.6.1 Laravel Framework 6.6.2
MongoDB Driver 1.6.1
Hope you can help
try this:
replace hasMany method in your Model:
$instance->newQuery(), $this, $instance->getTable().'.'.$foreignKey, $localKey
to
$instance->newQuery(), $this, $foreignKey, $localKey
such as
/**
* Define a one-to-many relationship.
*
* @param string $related
* @param string $foreignKey
* @param string $localKey
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function hasManyMongo($related, $foreignKey = null, $localKey = null)
{
$instance = $this->newRelatedInstance($related);
$foreignKey = $foreignKey ?: $this->getForeignKey();
$localKey = $localKey ?: $this->getKeyName();
return $this->newHasMany(
$instance->newQuery(), $this, $foreignKey, $localKey
);
}
in my project's case :
public function items(){
// return $this->hasMany(KjzxCheckTaskItem::class,'task_id','id');
$instance = $this->newRelatedInstance(KjzxCheckTaskItem::class);
return $this->newHasMany(
$instance->newQuery(), $this, 'task_id', 'id'
);
}
I figure it out myself. In this repository, HasMany class extends EloquentHasMany of Laravel. And in the EloquentHasMany class, Laravel uses getIdAttribute Mutator [1] to get a string ObjectId (This method was defined in src/Jenssegers/Mongodb/Eloquent/Model.php line 51) instead of a real ObjectId. Then obviously the query will fail due to the type comparison.
I have no idea how to resolve this in a creative way. Hopefully, this may help someone who is trying to figure out what's going on.
[1] getParentKey. src/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php line 83
At the one side model:
public function getIdAttribute($value = null)
{
return $value;
}
A bit tricky, but works. I don't know if this brokes something but my tests are passing.
@juanmanavarro worked like a charm with me, Thanks
@juanmanavarro thanks, its worked for me.