Laravel-mongodb: Relation hasMany will not work

Created on 5 Jan 2020  Â·  8Comments  Â·  Source: jenssegers/laravel-mongodb

Hi,
I am a MongoDB rookie and need your help.
I have 2 simple models:

Model merchant
Bildschirmfoto 2020-01-05 um 21 03 27

Controller
Bildschirmfoto 2020-01-05 um 21 04 47

collection merchants
Bildschirmfoto 2020-01-05 um 20 58 36

collection comments
Bildschirmfoto 2020-01-05 um 20 58 44

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

IlluminateDatabaseEloquentCollection {#371 â–¼
#items: []
}

Hope you can help me - many thanks

Needs investigation

Most helpful comment

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.

All 8 comments

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

Was this page helpful?
0 / 5 - 0 ratings

Related issues

BlakeGardner picture BlakeGardner  Â·  3Comments

bastiendonjon picture bastiendonjon  Â·  3Comments

viacheslavpleshkov picture viacheslavpleshkov  Â·  3Comments

Vasiliy-Bondarenko picture Vasiliy-Bondarenko  Â·  3Comments

sanjay1688 picture sanjay1688  Â·  3Comments