【问题标题】:Strange behaviour looping over Laravel belongstomany relationship with pluck to array在 Laravel 上循环的奇怪行为属于与 pluck 到数组的关系
【发布时间】:2020-09-07 01:39:36
【问题描述】:

我有 2 个模型 User 和 Publisher,通过多对多关系链接。当我尝试遍历用户拥有的每个发布者并将 ID 提取到数组时,循环运行正确的次数(在本例中为 5 次),但查询返回每个发布者 ID,而不仅仅是关系中的那些。

用户模型有

public function publishers()
{
    return $this->belongsToMany('App\Publisher')->withTimestamps();
}

和发布者模型有

  public function users()
  {
      return $this->belongsToMany('App\User')->withTimestamps();
  }

我的 foreach 循环是这样的

foreach ($user->publishers as $uPublisher) {
  $userPublisherIds[] = $uPublisher->pluck('id')->toarray();
}

我知道我可以使用 array_merge 来构建数组,我现在只是使用 [] 来查看循环迭代了多少次。

我不明白为什么 $user->publishers 给了我预期的过滤集合,但 $uPublishers 返回每个发布者 ID。很奇怪。

有人能说明为什么会这样吗?

【问题讨论】:

    标签: arrays laravel foreach


    【解决方案1】:

    pluck() 方法存在于集合数据库构建器中。当您调用 $uPublisher->pluck() 时,它会进行新的数据库调用,与您运行 Publisher::pluck() 时相同。

    在您的foreach 中,$uPublisher 是单个模型结果,而不是集合。由于 Eloquent 的 Active Record ORM 特性,单个模型实例仍然可以在其各自的表上充当查询构建器/执行器。

    $uPublisher->pluck() 被转发到 Model::__call(),然后冒泡到 Builder::pluck(),后者针对该模型/表运行新查询。

    正如您所尝试的,$user->publishers 返回一个集合,您可以针对该集合运行 pluck 以获取所有 ID。在您的循环中,您不会调用 pluck,您只需直接访问 ID 属性:

    $userPublisherIds[] = $uPublisher->id;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多