Sameer
Sameer

Reputation: 1814

update pivot table in case of many to many relation laravel4

I have started working with Laravel4 recently. I am facing some problem while updating pivot table data, in case of many to many relation.

The situation is: I have two table: Product, ProductType. The relation between them is Many to many. My Models are

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');
    }
}

While inserting data to the pivot table prd_tags, I did:

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

But now I want to update data in this pivot table, what is the best way to update data to the pivot table. Let's say, I want to delete some tags and add new tags to a particular product.

Upvotes: 10

Views: 23283

Answers (5)

Ken
Ken

Reputation: 3096

Since Laravel 6 you could also use newPivotQuery() if you would want to e.g. update() more than one pivot-model (database row) at the same time (using a Query\Builder::update() statement).

That would look something like this:

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

Or without the wherePivot methods:

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

Upvotes: 2

Hamid Naghipour
Hamid Naghipour

Reputation: 3625

this is full example :

 $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);

Upvotes: 0

Gokigooooks
Gokigooooks

Reputation: 794

Another method for this while working with laravel 5.0+

$tag = $product->tags()->find($tag_id);
$tag->pivot->foo = "some value";
$tag->pivot->save();

Upvotes: 6

Andrew
Andrew

Reputation: 1450

Old question, but on Nov 13, 2013, the updateExistingPivot method was made public for many to many relationships. This isn't in the official documentation yet.

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

--Updates an existing pivot record on the table.

As of Feb 21, 2014 you must include all three arguments.

In your case, (if you wanted to update the pivot field 'foo') you could do:

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

Or you can change the last boolean false to true if you want to touch the parent timestamp.

Pull request:

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

Upvotes: 38

Shishir
Shishir

Reputation: 2546

I know that this is an old question, but if you're still interested in the solution, here it is:

Lets say your pivot table has 'foo' and 'bar' as the additional attributes, you can do this to insert data into that table:

$product->tags()->attach($tag->tagID, array('foo' => 'some_value', 'bar'=>'some_other_value'));

Upvotes: 5

Related Questions