laravel-mongodb icon indicating copy to clipboard operation
laravel-mongodb copied to clipboard

Relation hasMany will not work

Open inkvc17 opened this issue 5 years ago • 11 comments

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

Illuminate\Database\Eloquent\Collection {#371 ▼ #items: [] }

Hope you can help me - many thanks

inkvc17 avatar Jan 05 '20 20:01 inkvc17

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

quachtinh761 avatar Jan 09 '20 08:01 quachtinh761

@inkvc17, what is the version laravel-mongodb, php driver and mongo?

Smolevich avatar Jan 20 '20 15:01 Smolevich

@Smolevich this is related to this PR https://github.com/jenssegers/laravel-mongodb/pull/1523

divine avatar Jan 20 '20 23:01 divine

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

inkvc17 avatar Jan 22 '20 08:01 inkvc17

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'
        );
    }

xiaoxiaoyu93 avatar Sep 15 '20 14:09 xiaoxiaoyu93

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

tailtq avatar Apr 08 '21 04:04 tailtq

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 avatar Jul 19 '21 16:07 juanmanavarro

@juanmanavarro worked like a charm with me, Thanks

waiel avatar Jul 23 '21 07:07 waiel

@juanmanavarro thanks, its worked for me.

rizalreza avatar Feb 28 '22 14:02 rizalreza