尽管我定义了“ id”,但雄辩的口号一直在寻找“ user_id”而不是“ id”

时间:2018-12-07 07:06:46

标签: php laravel eloquent

我有一个用户表:

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->integer('role_id')->unsigned();
    $table->timestamp('email_verified_at')->nullable();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});

角色表:

Schema::create('roles', function (Blueprint $table) {
    $table->increments('id');
    $table->string('role');
    $table->timestamps();
});

还有付款表:

Schema::create('payments', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('user_id')->unsigned();
    $table->integer('driver_id')->unsigned();
    $table->integer('amount');
    $table->date('payment_date');
    $table->timestamps();
});

我还为角色(role_id)的用户添加了外部约束。

Schema::table('users', function ($table) {
            $table
            ->foreign('role_id')
            ->references('id')
            ->on('roles')
            ->onUpdate('cascade');
        });

当我尝试用伪造者生成虚拟付款时,我试图从user_id的{​​{1}}为users的{​​{1}}中获得随机role,并从另一个{{1 }}从user开始,其user_idusers

role

但是在何处引发错误:

driver

如果我这样删除$factory->define(App\Models\Payment::class, function (Faker $faker) { return [ 'user_id' => App\User:: //get user whereHas('roles', function ($query) { $query->where('role', 'user');}) //where its role is user ->select('id') //get its id ->get() ->random(), 'driver_id' => App\User:: whereHas('roles', function ($query) { $query->where('role', 'driver');}) ->select('id') ->get() ->random(), 'amount' => $faker->randomNumber, 'payment_date' => $faker->date($format = 'Y-m-d', $max = 'now') ]; }); 部分,它会起作用:

Illuminate\Database\QueryException  : SQLSTATE[42S22]: Column not found: 1054 Unknown column 'roles.user_id' in 'where clause' (SQL: select `id` from `users` where exists (select * from `roles` where `users`.`id` = `roles`.`user_id` and `role` = driver))

我确定在我的whereHas查询中我没有在whereHas表中寻找App\User::select('id') ->get() ->random(), ,所以为什么要这样做呢?

编辑:这是我的模型

角色

user_id

用户

roles

1 个答案:

答案 0 :(得分:0)

这是我找到的解决方案。 Laravel假定用户模型中roles的外键是roles_id,即使我使用了role_id。要覆盖此参数,请在role_id函数中的模型之后放置另一个参数belongsTo()。 在用户模型中

public function roles()
{
    return $this->belongsTo('App\Models\Role','role_id');
}