当我尝试运行数据库种子时,我在Laravel 5.5中收到了一个非常奇怪的错误。当我运行php artisan db:seed --class=RoleSeeder
时,我收到以下错误:
调用未定义的方法App \ Role :: firstOrCreate()
这是我的RoleSeeder
课程:
<?php
use Illuminate\Database\Seeder;
class RoleSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//Application User: All users have this role be default
$r = \App\Role::firstOrCreate(['name'=>'app-user'],
[
'name' => 'app-user',
'display_name' => 'All users of the application',
'description' => 'Uses the application',
]
);
}
}
我在许多Laravel 5.4项目中多次使用此代码段而没有问题。我在另一个神秘地解决了自己的Laravel 5.5项目中发生了这个错误,但现在我无法弄清楚为什么在一个新项目上再次发生这种情况。
当我在laravel tinker(交互式php会话)中运行上面的代码片段时,它可以正常运行。
我已经验证了firstOrCreate
函数的存在
vendor/laravel/src/Illuminate/Database/Eloquent/Builder.php
。
我的Role
类直接从Entrust库文档中复制:
<?php namespace App;
use Zizaco\Entrust\EntrustRole;
class Role extends EntrustRole
{
}
当我将Role
类更改为直接扩展Model
时,db:seed
命令运行正常。但是,Role
扩展EntrustRole
时会发生错误,其定义如下:
class EntrustRole extends Model implements EntrustRoleInterface
{
//..
我现在要实施一种解决方法,但是如果有人能够解释为什么这种方法在php artisan tinker
中工作正常,而不是在作为播种机运行时,那就太好了。
修改 经过进一步调查,它似乎只是偶尔发生:
user@localmachine:/var/www/MyProject$ sudo php artisan cache:clear
Cache cleared successfully.
user@localmachine:/var/www/MyProject$ sudo php artisan db:seed
Seeding: RoleSeeder
[BadMethodCallException]
Call to undefined method App\Role::firstOrCreate()
user@localmachine:/var/www/MyProject$ sudo php artisan cache:clear
Cache cleared successfully.
user@localmachine:/var/www/MyProject$ sudo php artisan cache:clear
Cache cleared successfully.
user@localmachine:/var/www/MyProject$ sudo php artisan cache:clear
Cache cleared successfully.
user@localmachine:/var/www/MyProject$ sudo php artisan cache:clear
Cache cleared successfully.
user@localmachine:/var/www/MyProject$ sudo php artisan db:seed
Seeding: RoleSeeder
Seeding: UserSeeder
答案 0 :(得分:0)
将缓存驱动程序切换到redis后,问题现在已解决。我现在意识到这可能是“神秘地”修复了我的另一个Laravel 5.5项目(当我将缓存驱动程序切换到memcached时)。看起来像是Laravel 5.5和文件缓存驱动程序的错误