如何在laravel中更新多态的多对多数据透视记录(使用精确的数据透视ID)?

时间:2016-08-20 10:42:55

标签: php laravel orm

我想在数据透视级别访问我的多态(多对多)关系。让我们说:

- pages
  id - title
- articles
  id - title - body
- quotes
  id - title - body
- pageables
  id - order - pageable_type - pageable_id - page_id

现在你可以看到我有可以有文章和引语的页面。这样我就可以按顺序调用页面及其内容(文章和引号)。例如:

  page1
     article1
     quote3
  page2
     article2
     quote1
  page3
     article1
     quote1
     article1

请注意'第3页'有两篇文章1'。页面可以包含多个相同文章或引号。实际上,这就是为什么我需要使用它的完全行ID来更新完全数据透视表。是的我可以使用sync()方法,但它会删除所有重复的记录。即使我使用syncWithoutDetaching(),我也无法更新我想要的确切数据透视表。另一方面,我尝试了updateExistingPivot()方法,但它也没有更新(确切的)数据透视表。例如:

\App\Article::find(1)->pages()->updateExistingPivot(3, ['page_id'=>1]);

这里假设第一个参数是页面的id而不是枢轴行本身的id(通常枢轴表根本没有id)。

有没有任何荒凉的方式来做到这一点? (除了使用流畅的查询构建器或首先不接受重复记录:))

1 个答案:

答案 0 :(得分:1)

你可以这样做:

public function pages()
{
    return $this->belongsToMany('Page')->withPivot('row_id', 'other_field_in_pivot_table_you_need');
}

\App\Article::find(1)
    ->pages()
    ->newPivotStatement()
    ->where('row_id', $your_row_id)
    ->update(['order' => 5]);

newPivotStatemant()将成为Query\Builder的对象,因此在这种情况下您不会拥有任何雄辩的功能。这应该是清楚的,因为你还没有为你的数据透视表设置一个Eloquent模型。