我有一个用户表:
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_id
是users
。
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
答案 0 :(得分:0)
这是我找到的解决方案。
Laravel假定用户模型中roles
的外键是roles_id
,即使我使用了role_id
。要覆盖此参数,请在role_id
函数中的模型之后放置另一个参数belongsTo()
。
在用户模型中
public function roles()
{
return $this->belongsTo('App\Models\Role','role_id');
}