Skip to content

Overriding $primaryKey is still an issue #1958

Closed
@paouriel

Description

@paouriel
  • Laravel-mongodb Version: 3.6.1
  • PHP Version: 7.3.14
  • Database Driver & Version: mongodb / mongo v4.2.3

Description:

I am trying to use a custom primary key, but it persists on using _id. After checking similar issues, I found out it posted here #1354 and fixed here #1392.

I checked the code from the library and saw it wasn't changed.
Here is the link to the file from master branch:
https://github.com/jenssegers/laravel-mongodb/blob/master/src/Jenssegers/Mongodb/Query/Builder.php#L189)

Here is the link to the file from merge request:
https://github.com/jenssegers/laravel-mongodb/pull/1392/files

Am I missing something here?

Steps to reproduce

  1. Add the following code to your model:
    protected $primaryKey = 'fieldName'

  2. Run php artisan migrate:refresh

Expected behaviour

I should be able to use a custom primary key.

Actual behaviour

The model uses a hard-coded string _id for its primary key

Logs:

[2020-02-11 01:41:07] local.ERROR: Undefined index: rid {"exception":"[object] (ErrorException(code: 0): Undefined index: rid at /var/www/vendor/jenssegers/mongodb/src/Jenssegers/Mongodb/Query/Builder.php:582)
[stacktrace]
#0 /var/www/vendor/jenssegers/mongodb/src/Jenssegers/Mongodb/Query/Builder.php(582): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'Undefined index...', '/var/www/vendor...', 582, Array)
#1 /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(1366): Jenssegers\Mongodb\Query\Builder->insertGetId(Array, 'rid')
#2 /var/www/vendor/jenssegers/mongodb/src/Jenssegers/Mongodb/Eloquent/Builder.php(78): Illuminate\Database\Eloquent\Builder->__call('insertGetId', Array)
#3 /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(839): Jenssegers\Mongodb\Eloquent\Builder->insertGetId(Array, 'rid')
#4 /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(804): Illuminate\Database\Eloquent\Model->insertAndSetId(Object(Jenssegers\Mongodb\Eloquent\Builder), Array)
#5 /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(667): Illuminate\Database\Eloquent\Model->performInsert(Object(Jenssegers\Mongodb\Eloquent\Builder))
#6 /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php(219): Illuminate\Database\Eloquent\Model->save()
#7 /var/www/vendor/laravel/framework/src/Illuminate/Support/Traits/EnumeratesValues.php(176): Illuminate\Database\Eloquent\FactoryBuilder->Illuminate\Database\Eloquent\{closure}(Object(App\Student), 0)
#8 /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php(220): Illuminate\Support\Collection->each(Object(Closure))
#9 /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php(181): Illuminate\Database\Eloquent\FactoryBuilder->store(Object(Illuminate\Support\Collection))
#10 /var/www/database/seeds/StudentTeacherSeeder.php(19): Illuminate\Database\Eloquent\FactoryBuilder->create(Array)
#11 /var/www/vendor/laravel/framework/src/Illuminate/Support/Traits/EnumeratesValues.php(176): StudentTeacherSeeder->{closure}(Object(App\Teacher), 0)
#12 /var/www/database/seeds/StudentTeacherSeeder.php(27): Illuminate\Support\Collection->each(Object(Closure))
#13 [internal function]: StudentTeacherSeeder->run()
#14 /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(32): call_user_func_array(Array, Array)
#15 /var/www/vendor/laravel/framework/src/Illuminate/Container/Util.php(36): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#16 /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(90): Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
#17 /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(34): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#18 /var/www/vendor/laravel/framework/src/Illuminate/Container/Container.php(590): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#19 /var/www/vendor/laravel/framework/src/Illuminate/Database/Seeder.php(134): Illuminate\Container\Container->call(Array)
#20 /var/www/vendor/laravel/framework/src/Illuminate/Database/Seeder.php(48): Illuminate\Database\Seeder->__invoke()
#21 /var/www/database/seeds/DatabaseSeeder.php(17): Illuminate\Database\Seeder->call('StudentTeacherS...')
#22 [internal function]: DatabaseSeeder->run()
#23 /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(32): call_user_func_array(Array, Array)
#24 /var/www/vendor/laravel/framework/src/Illuminate/Container/Util.php(36): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#25 /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(90): Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
#26 /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(34): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#27 /var/www/vendor/laravel/framework/src/Illuminate/Container/Container.php(590): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#28 /var/www/vendor/laravel/framework/src/Illuminate/Database/Seeder.php(134): Illuminate\Container\Container->call(Array)
#29 /var/www/vendor/laravel/framework/src/Illuminate/Database/Console/Seeds/SeedCommand.php(63): Illuminate\Database\Seeder->__invoke()
#30 /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/GuardsAttributes.php(122): Illuminate\Database\Console\Seeds\SeedCommand->Illuminate\Database\Console\Seeds\{closure}()
#31 /var/www/vendor/laravel/framework/src/Illuminate/Database/Console/Seeds/SeedCommand.php(64): Illuminate\Database\Eloquent\Model::unguarded(Object(Closure))
#32 [internal function]: Illuminate\Database\Console\Seeds\SeedCommand->handle()
#33 /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(32): call_user_func_array(Array, Array)
#34 /var/www/vendor/laravel/framework/src/Illuminate/Container/Util.php(36): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#35 /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(90): Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
#36 /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(34): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#37 /var/www/vendor/laravel/framework/src/Illuminate/Container/Container.php(590): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#38 /var/www/vendor/laravel/framework/src/Illuminate/Console/Command.php(201): Illuminate\Container\Container->call(Array)
#39 /var/www/vendor/symfony/console/Command/Command.php(255): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArrayInput), Object(Illuminate\Console\OutputStyle))
#40 /var/www/vendor/laravel/framework/src/Illuminate/Console/Command.php(188): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArrayInput), Object(Illuminate\Console\OutputStyle))
#41 /var/www/vendor/laravel/framework/src/Illuminate/Console/Concerns/CallsCommands.php(56): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArrayInput), Object(Illuminate\Console\OutputStyle))
#42 /var/www/vendor/laravel/framework/src/Illuminate/Console/Concerns/CallsCommands.php(28): Illuminate\Console\Command->runCommand('db:seed', Array, Object(Illuminate\Console\OutputStyle))
#43 /var/www/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/FreshCommand.php(79): Illuminate\Console\Command->call('db:seed', Array)
#44 /var/www/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/FreshCommand.php(56): Illuminate\Database\Console\Migrations\FreshCommand->runSeeder(NULL)
#45 [internal function]: Illuminate\Database\Console\Migrations\FreshCommand->handle()
#46 /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(32): call_user_func_array(Array, Array)
#47 /var/www/vendor/laravel/framework/src/Illuminate/Container/Util.php(36): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#48 /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(90): Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
#49 /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(34): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#50 /var/www/vendor/laravel/framework/src/Illuminate/Container/Container.php(590): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#51 /var/www/vendor/laravel/framework/src/Illuminate/Console/Command.php(201): Illuminate\Container\Container->call(Array)
#52 /var/www/vendor/symfony/console/Command/Command.php(255): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#53 /var/www/vendor/laravel/framework/src/Illuminate/Console/Command.php(188): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#54 /var/www/vendor/symfony/console/Application.php(1012): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#55 /var/www/vendor/symfony/console/Application.php(272): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Database\Console\Migrations\FreshCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#56 /var/www/vendor/symfony/console/Application.php(148): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#57 /var/www/vendor/laravel/framework/src/Illuminate/Console/Application.php(93): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#58 /var/www/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(131): Illuminate\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#59 /var/www/artisan(37): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#60 {main}
"}

Activity

divine

divine commented on Feb 11, 2020

@divine
Contributor

Hello,

That's definitely a bug, however not sure why it was reverted back to fix a "tests"?

No explanation was given from @jenssegers so we're on just our own.

db98372#r26758163

@Smolevich @Giacomo92 @rennokki any suggestions what we need to do?

Thank you!

Giacomo92

Giacomo92 commented on Feb 11, 2020

@Giacomo92

php artisan migrate:refresh is unuseful because MongoDB is schema less. So if you run that command the structure will not be updated.

You should create a command to do that

andycansdale

andycansdale commented on Feb 18, 2020

@andycansdale

@paouriel I experienced this same issue today and I tracked it down to having tried to create a record with a null value for my custom primary key. When passing a valid value it to works fine.

Perhaps an error message for when the custom primary key is null would be helpful.

DaniloBenevides

DaniloBenevides commented on Jun 25, 2020

@DaniloBenevides

Is there any update?
I have checked the code and the correction still not applied, "_id" is hardcoded on Jessengers/Mongodb/Query/Builder on version 3.6.4

stephenjude

stephenjude commented on Jul 18, 2020

@stephenjude
Contributor

@Smolevich I have looked into this issue and found that this issue exists. The Builder uses a hard-coded string _id for its primary key. Should I make a pull request to fix this?

divine

divine commented on Jul 18, 2020

@divine
Contributor

@stephandesouza it's an easy fix but some tests are failing. This is the main reason why it's being delayed.

However, I might take a look soon.

divine

divine commented on Sep 16, 2020

@divine
Contributor

I've just checked this and can confirm that there is no issue at all.

See this test and this model

$check = Book::find('A Game of Thrones');
$this->assertEquals('title', $check->getKeyName());
$this->assertEquals('A Game of Thrones', $check->getKey());
$this->assertEquals('A Game of Thrones', $check->title);

It looks like hard coded, however it's being changed when queried within Eloquent, see this function which is being used in this library.

If it doesn't work for you, then check keyType is defined correctly (by default it's being converted to string)

Thanks!

added and removed
Needs investigationNeed investigation about bugs described in issue
on Sep 16, 2020
stephenjude

stephenjude commented on Sep 17, 2020

@stephenjude
Contributor

Okay

erickneverson

erickneverson commented on May 12, 2021

@erickneverson

For me, it was definitely about specifying the keyType as @divine stated. I'll leave a snippet from my model here in case anyone is wondering:

protected $primaryKey = 'user_id';
protected $keyType = 'int';
locked as resolved and limited conversation to collaborators on May 12, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @DaniloBenevides@Smolevich@andycansdale@Giacomo92@erickneverson

        Issue actions

          Overriding $primaryKey is still an issue · Issue #1958 · mongodb/laravel-mongodb