9

我最近开始使用 Laravel4。在多对多关系的情况下,我在更新数据透视表数据时遇到了一些问题。

情况是:我有两个表:ProductProductType。他们之间的关系是多对多。我的模型是

class Product extends Eloquent {
    protected $table = 'products';
    protected $primaryKey = 'prd_id';

    public function tags() {
        return $this->belongsToMany('Tag', 'prd_tags', 'prta_prd_id', 'prta_tag_id');
    }
}

class Tag extends Eloquent {
    protected $table = 'tags';
    protected $primaryKey = 'tag_id';
        public function products()
    {
    return $this->belongsToMany('Product', 'prd_tags', 'prta_prd_id', 'prta_tag_id');
    }
}

在将数据插入数据透视表 prd_tags 时,我做了:

$product->tags()->attach($tag->tagID);

但是现在我想更新这个数据透视表中的数据,将数据更新到数据透视表的最佳方法是什么。假设我想删除一些标签并为特定产品添加新标签。

4

5 回答 5

36

老问题,但在 2013 年 11 月 13 日,updateExistingPivot 方法对多对多关系公开。这还没有在官方文档中。

public void updateExistingPivot(mixed $id, array $attributes, bool $touch)

--更新表上现有的数据透视记录。

自 2014 年 2 月 21 日起,您必须包含所有三个参数。

在你的情况下,(如果你想更新数据透视字段'foo')你可以这样做:

$product->tags()->updateExistingPivot($tag->tagID, array('foo' => 'value'), false);

或者,如果您想触摸父时间戳,您可以将最后一个布尔值 false 更改为 true。

拉取请求:

https://github.com/laravel/framework/pull/2711/files

于 2014-02-21T18:29:02.057 回答
6

使用 laravel 5.0+ 时的另一种方法

$tag = $product->tags()->find($tag_id);
$tag->pivot->foo = "some value";
$tag->pivot->save();
于 2016-02-17T18:31:04.390 回答
5

我知道这是一个老问题,但如果您仍然对解决方案感兴趣,这里是:

假设您的数据透视表具有“foo”和“bar”作为附加属性,您可以这样做将数据插入该表:

$product->tags()->attach($tag->tagID, array('foo' => 'some_value', 'bar'=>'some_other_value'));
于 2013-12-12T13:18:40.457 回答
1

从 Laravel 6 开始,newPivotQuery()如果您想同时使用update()多个数据透视模型(数据库行)(使用Query\Builder::update()语句),也可以使用。

看起来像这样:

$someModel->someBelongsToManyRelation()
    ->wherePivotNotIn('some_column', [1, 2, 3])
    ->wherePivotNull('some_other_column')
    ->newPivotQuery()
    ->update(['some_other_column' => now()]);

或者没有 wherePivot 方法:

$someModel->someBelongsToManyRelation()
    ->newPivotQuery()
    ->whereNotIn('some_column', [1, 2, 3])
    ->whereNull('some_other_column')
    ->update(['some_other_column' => now()]);
于 2022-02-09T13:31:38.587 回答
0

这是完整的例子:

 $user = $this->model->find($userId);
    $user->discounts()
        ->wherePivot('discount_id', $discountId)
        ->wherePivot('used_for_type', null)
        ->updateExistingPivot($discountId, [
            'used_for_id' => $usedForId,
            'used_for_type' => $usedForType,
            'used_date_time' => Carbon::now()->toDateString(),
        ], false);
于 2017-01-13T22:12:53.130 回答