Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Relation hasMany will not work #1902

Open
inkvc17 opened this issue Jan 5, 2020 · 10 comments
Open

Relation hasMany will not work #1902

inkvc17 opened this issue Jan 5, 2020 · 10 comments
Labels
Needs investigation Need investigation about bugs described in issue

Comments

@inkvc17
Copy link

inkvc17 commented Jan 5, 2020

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

@quachtinh761
Copy link

Hi bro, i also faced the same problem, then i saw this issue: #1383
Hope this can help you

@Smolevich Smolevich added the Needs investigation Need investigation about bugs described in issue label Jan 20, 2020
@Smolevich
Copy link
Contributor

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

@divine
Copy link
Contributor

divine commented Jan 20, 2020

@Smolevich this is related to this PR #1523

@inkvc17
Copy link
Author

inkvc17 commented Jan 22, 2020

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

@xiaoxiaoyu93
Copy link

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

@tailtq
Copy link

tailtq commented Apr 8, 2021

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

@juanmanavarro
Copy link

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.

@waiel
Copy link

waiel commented Jul 23, 2021

@juanmanavarro worked like a charm with me, Thanks

@rizalreza
Copy link

@juanmanavarro thanks, its worked for me.

@cyberwizard-dev
Copy link

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.

I know this is an old thread but, this works for hasMany. On my Laravel nova table, on the other hand, the id is missing and this leads to a 404 when I click on any record on the table.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Needs investigation Need investigation about bugs described in issue
Projects
None yet
Development

No branches or pull requests

10 participants