Laravel多对多关系返回空数组

时间:2019-07-29 11:07:13

标签: php laravel

我正在尝试使用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());

1 个答案:

答案 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为空。