【问题标题】:Laravel many to many relationship returning empty arrayLaravel 多对多关系返回空数组
【发布时间】:2019-07-29 11:07:13
【问题描述】:

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

【问题讨论】:

  • 能否在您的问题中添加更多代码?
  • 可能取决于调用方法的顺序,试试这个$table->foreign('user_id')->references('id')->on('users');
  • @potiev 不,不幸的是,事实并非如此。我更改了迁移仍然是相同的问题
  • 很明显它在查询中有null,你初始化了一个没有ID的用户? new User() 不会将一个保存到数据库中
  • 为什么你觉得$user->survey()->toSql()返回了错误的查询?你确定数据库中有数据吗?

标签: php laravel


【解决方案1】:

我只是想让所有在他们的数据透视表中分配了调查的用户。

要获取存在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() 时,它会构建一个查询来搜索用户 ID 为空的 survey_user

【讨论】:

  • 非常感谢,关于从 pivot 获取结果的问题已经很清楚了 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 2019-10-01
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
相关资源
最近更新 更多