我正在尝试使用laravel多对多关系获取结果,但是查询生成错误,因此它返回空数组。
$user->survey()->get()
返回空数组。
$user->survey()->toSql()
返回错误的查询:
SELECT
*
FROM
`survey`
INNER JOIN `survey_user` ON `survey`.`id` = `survey_user`.`survey_id`
WHERE
`survey_user`.`user_id` IS NULL
最后,user_id不应为null。
调查数据透视表的迁移:
Schema::create('survey_user', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->integer('survey_id')->unsigned();
$table->string('status', 50)->nullable();
$table->timestamps();
});
Schema::table('survey_user', function (Blueprint $table) {
$table->foreign('user_id')->on('users')->references('id');
$table->foreign('survey_id')->references('id')->on('survey')
->onDelete('cascade')
->onUpdate('cascade');
});
}
这是两个关系:
public function survey()
{
return $this->belongsToMany(Survey::class, 'survey_user')
->withPivot('status')
->withTimestamps();
}
public function user()
{
return $this->belongsToMany(User::class, 'survey_user')
->withPivot('status')
->withTimestamps();
}
我只是想让所有在调查中分配调查的用户。
$user = new User();
var_dump($user->survey()->get());
答案 0 :(得分:0)
我只是想让所有在调查中分配调查的用户。
要获得存在survey
关系的所有用户,您的代码应如下所示:
$users = User::has('survey')->get();
如果在使用模型时需要将survey
关系加载到模型上,则将with()
添加到eager load关系中:
$users = User::has('survey')
->with('survey')
->get();
最后,user_id不应为null。
使用空用户ID进行搜索的原因是因为您正在使用尚未保存到数据库的new User
实例进行搜索。这是您遇到问题的代码:
$user = new User();
var_dump($user->survey()->get());
由于$user
是一个尚未保存到数据库的新对象,因此没有ID。当您调用$user->survey()
时,它会生成一个查询来搜索survey_user
,其中用户ID为空。